Имя: Пароль:
1C
 
Проблема с регистром
0 Dan12345
 
26.02.23
22:17
Есть регистр накопления "УчетПоступленияСписанияКниг", в нем ведется учет поступления и списания книг.
В документе "Списание книг" в табличной части создаю несколько строк, в каждой из которых указываю книгу и экземпляр. Стоит проверка на ввод существующего экземпляра. И пользователю так же предлагается выбор только из тех экземпляров, которые есть в регистре для конкретной книги. Но если я укажу один и тот же экземпляр, то документ проведется и и в регистр запишутся 2 записи списания одного экземпляра. Как сделать так, чтобы значение измерения "Экземпляр" было так сказать уникальным? (хотя, я думал, оно и так должно быть таким).
1 saaken
 
26.02.23
22:29
проводи документ после каждого выбора эксземпляра
2 DCEP
 
26.02.23
22:29
(0) Не проводить
3 mkalimulin
 
26.02.23
22:31
(0) Не проводить документ, если в нем есть дубли
4 Dan12345
 
26.02.23
22:39
Я и думаю, как сделать так, чтобы не проводить документ, в случае, если для каждой книги выбран один и тот же экземпляр.
Вот код:

Процедура ОбработкаПроведения(Отказ, Режим)    

    Движения.УчётПоступленияСписанияКниг.Записывать = Истина;
    Для Каждого ТекСтрокаСписанныеКниги Из СписанныеКниги Цикл
        Движение = Движения.УчётПоступленияСписанияКниг.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Книга = ТекСтрокаСписанныеКниги.Книга;
        Движение.Экземпляр = ТекСтрокаСписанныеКниги.Экземпляр;
        Движение.Количество = 1;
        Движение.Статус = "Списание";
    КонецЦикла;

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    УчётПоступленияСписанияКнигОстатки.Экземпляр КАК Экземпляр
    |ИЗ
    |    РегистрНакопления.УчётПоступленияСписанияКниг.Остатки(, ) КАК УчётПоступленияСписанияКнигОстатки
    |ГДЕ
    |    УчётПоступленияСписанияКнигОстатки.Книга = &Книга
    |    И УчётПоступленияСписанияКнигОстатки.Экземпляр = &Экземпляр
    |
    |СГРУППИРОВАТЬ ПО
    |    УчётПоступленияСписанияКнигОстатки.Экземпляр
    |
    |ИМЕЮЩИЕ
    |    КОЛИЧЕСТВО(УчётПоступленияСписанияКнигОстатки.Экземпляр) > 0";
    
    Для Каждого ТекСтрокаСписанныеКниги Из СписанныеКниги Цикл
        
        Запрос.УстановитьПараметр("Книга", ТекСтрокаСписанныеКниги.Книга);
        Запрос.УстановитьПараметр("Экземпляр", ТекСтрокаСписанныеКниги.Экземпляр);
        
        РезультатЗапроса = Запрос.Выполнить();
        
        Если РезультатЗапроса.Пустой() Тогда
            Отказ = Истина;
            Сообщение = Новый СообщениеПользователю();
            Сообщение.Текст = "Экземпляра " + ТекСтрокаСписанныеКниги.Экземпляр + " книги '" + ТекСтрокаСписанныеКниги.Книга + "' нет в наличии";
            Сообщение.Сообщить();
        КонецЕсли;
    КонецЦикла;

    
КонецПроцедуры
5 mistеr
 
26.02.23
22:44
(0) Уникальность есть в регистрах сведений, в регистрах накопления нет.

То, что ты хочешь, называется контроль остатков, если я правильно понял. По этим словам и гугли.
6 Donkey_hot
 
26.02.23
22:55
(4) Выбираете запросом данные из табличной части документа (он уже записан на момент обработки проведения), группируете по двум полям - Книга, Экземпляр. Если есть строки, ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1, не проводите.
7 Dan12345
 
26.02.23
23:20
(6) Спасибо!
8 bolder
 
26.02.23
23:47
(0) Элементарно.На языке специалистов 1С это называется новая методикапроведения. Суть ее в проверке неотрицательные остатки после проведения документа.Если обнаружены отрицательные остатки - выводим сообщение и отказываем в проведении.
9 Donkey_hot
 
27.02.23
00:02
(8) Да остатки у него сделаны, требуется проверить на дубли в самом доке.
10 bolder
 
27.02.23
00:10
(9) Это тоже проверитьсяпри проведении по новой методике, все универсально получается.
11 bolder
 
27.02.23
00:12
(10) Если он решает такую задачу на экзамене - и не использует упомянутый приём - то сразу неуд.
12 bolder
 
27.02.23
00:15
(9) Очень советую ознакомился и использовать.Значительно ускоряет проведение и контрольостатков.
А замечание остатки сформированы не понял как относится к данной задаче недопущения двойных и более списаний .
13 Donkey_hot
 
27.02.23
00:17
(10) Не очень понятно, причем тут новая методика. Если дубли в самом документе, нет смысла блокировать что-то, все равно в отказ пойдем. По идее, это вообще лучше сделать ПередЗаписью.
14 Злопчинский
 
27.02.23
03:17
(12) "Значительно ускоряет проведение и контрольостатков."
то есть записать что-то, потом удалить записанное - это реально быстрее чем просчитать перед записью?
15 Bigbro
 
27.02.23
05:57
(14) видимо да, по крайней мере в 1с8 это стандартный механизм.
16 JeHer
 
27.02.23
06:07
Если юзер скопирует документ, то снова в минус уйдет регистр. Это тоже надо учесть
17 Злопчинский
 
27.02.23
06:08
(15) ..реализованный программно. А в реальности быстрее это или нет - никто не проверял...
18 Donkey_hot
 
27.02.23
06:17
(15) Если речь идет о контроле остатков, почему бы и нет. Но тут предлагают товарищу по новой методике проверять, есть ли в табличной части самого объекта дубли по двум колонкам.
19 Bigbro
 
27.02.23
06:32
(18) ну если экземпляр штука уникальная, и на остатке может быть ноль либо один, то таким образом как раз гарантируется несписание "в минус", если один и тот же в разных строках по ошибке дважды указали. вроде именно то что нужно.
20 Bigbro
 
27.02.23
06:37
(17) проверяли, там запросы проще, для экзамена на спеца вроде как обязательное условие использование нового механизма для контроля.
на курсах 1с тоже было описано, в комментах подробности.
https://xn----1-bedvffifm4g.xn--p1ai/articles/2017-02-12-two-methods-for-inventory-check/
не реклама если что.
21 Donkey_hot
 
27.02.23
07:17
(19) По-моему это все-таки немного разные вещи. Если конечно он на остатке один, тогда да. А если его ноль? Тогда хоть одной строчкой его списывай, хоть десятью - все равно в минус уйдет. Поэтому против контроля остатков по новой методике ничего не имею, но предварительно же надо проверить на дубли. И все, что нужно для такого контроля, есть в самом объекте. Смысл его записывать? Дубль может возникнуть же не просто из-за того, что одну строчку дважды ввели, а, например, опечатались в экземпляре. И если юзер получит просто сообщение о превышении остатка, оно не будет указывать на причину.
22 Donkey_hot
 
27.02.23
07:18
(20) Старая методика тоже имеет место быть на экзамене. Павел Станиславович на своем курсе четко рассказывал, когда какую применять.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший