В процессе работы с программами 1С часто возникает ситуация, когда пользователи пытаются изменить или удалить строки в проведенном документе Поступление товаров и услуг за прошлый период. Если товары из этого поступления уже были проданы (списаны со склада или реализованы конкретные партии), любое изменение документа-первоисточника приводит к искажению себестоимости, появлению отрицательных остатков или сбоям в цепочке партионного учета. Проанализируем, как правильно защитить систему от подобных действий штатными и программными средствами.
Прежде чем писать код, стоит рассмотреть готовые функциональные возможности типовых решений 1С:
Корректировка поступления в текущем периоде, вместо исправления оригинального проведённого документа.Если необходимо запретить редактирование только тех документов поступления, по которым уже есть фактические движения расхода товаров, разберем программную проверку при открытии формы.
Посмотрим на алгоритм: при открытии формы проведенного документа выполняется запрос к регистру накопления (например, ПартииТоваровНаСкладах или ТоварыНаСкладах). Если по партионному документу найдены движения с видом Расход, переводим форму в режим «Только просмотр».
Пример реализации в обработчике события ПриОткрытии формы документа:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ПартииТоваров.Регистратор КАК ДокументСписания
|ИЗ
| РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваров
|ГДЕ
| ПартииТоваров.ДокументОприходования = &ДокументОприходования
| И ПартииТоваров.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)";
Запрос.УстановитьПараметр("ДокументОприходования", ЭтотОбъект.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
ЭтаФорма.ТолькоПросмотр = Истина;
Предупреждение("По данному поступлению уже выполнены списания товаров! Изменение документа запрещено.");
КонецЕсли;
Ограничения только на уровне формы недостаточно, так как документ может быть изменен программно или снят с проведения из списка. Чтобы полностью перекрыть возможность изменения проведённых партий, разберем подписку на событие ПередЗаписью документа или обработку события ПередУдалением табличной части.
Рассмотрим порядок действий при проверке перед записью:
Отказ = Истина и выводим понятное пользователю сообщение.Пример кода проверки в модуле объекта или подписке на событие:
Если Не Отказ И ЭтотОбъект.Проведен Тогда
УстановитьПривилегированныйРежим(Истина);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ПартииТоваров.Номенклатура
|ИЗ
| РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваров
|ГДЕ
| ПартииТоваров.ДокументОприходования = &Ссылка
| И ПартииТоваров.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Если НЕ Запрос.Выполнить().Пустой() Тогда
Отказ = Истина;
Сообщить("Нельзя изменить или отменить проведение поступления: по созданной партии уже есть движения реализации!");
КонецЕсли;
КонецЕсли;
При внедрении программных проверок проанализируем следующие ограничения и особенности платформы 1С:
УстановитьПривилегированныйРежим(Истина).ОбработкаОтменыПроведения модуля документа.КритерииОтбора.СвязанныеДокументы. Если дерево подчиненности содержит проведенные реализации или возвраты, блокируем редактирование.