В практике разработки на платформе 1С:Предприятие 8 часто возникает задача предоставить пользователю возможность вручную править проводки и движения по регистрам, которые сформировал документ. В типовых решениях, таких как «Бухгалтерия предприятия», этот механизм реализован через установку специального флага «Ручная корректировка». Однако при создании собственных (нетиповых) документов программисты часто сталкиваются с тем, что изменения, внесенные в форму корректировки, не сохраняются или затираются при перепроведении. В качестве готового примера внедрения такого механизма в типовой документ можно использовать расширение для ручной корректировки проводок больничного листа в 1С:Бухгалтерии 3.0.
Разберем подробно, как правильно настроить этот механизм, чтобы он работал стабильно и корректно, опираясь на опыт решения подобных задач.
Проанализируем типичную ситуацию: в конфигурацию добавлен новый документ (например, Заказ-наряд). Мы добавили в него реквизит РучнаяКорректировка с типом Булево и вызвали стандартную функцию обработки. Казалось бы, этого достаточно, но при записи проводок в форме корректировки данные в регистрах остаются прежними. Выясним причину этого поведения.
Основная причина кроется в свойствах самого объекта Документ в Конфигураторе. По умолчанию платформа 1С управляет записями регистров в зависимости от настроек проведения. Для корректной работы ручных правок нам необходимо изменить режим записи движений.
Рассмотрим пошагово настройки в Конфигураторе:
Почему это важно? Если установлено значение «Записывать выбранные», платформа ожидает явного указания набора записей для записи. Режим «Записывать модифицированные» позволяет системе сохранять только те наборы записей (движения), которые были изменены в процессе проведения или через форму корректировки движений.
Также обратим внимание на свойство «Удаление движений». Для документов с ручной правкой рекомендуется устанавливать «Удалять автоматически при отмене проведения». Если оставить просто «Удалять автоматически», то при каждом нажатии кнопки «Провести» система будет полностью очищать старые ручные правки еще до начала выполнения кода в модуле объекта.
Теперь проанализируем код внутри модуля документа. Главная задача — сделать так, чтобы при установленном флаге РучнаяКорректировка стандартный алгоритм проведения не выполнялся и не перезаписывал то, что пользователь ввел руками.
В процедуре ОбработкаПроведения необходимо добавить проверку в самом начале:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Если включена ручная корректировка, мы не должны пересчитывать движения
Если РучнаяКорректировка Тогда
Возврат;
КонецЕсли;
// Далее идет типовой код формирования движений
// ...
КонецПроцедуры
Эта простая проверка гарантирует, что если бухгалтер один раз внес правки в проводки, последующее нажатие на кнопку «ОК» в форме документа не уничтожит его работу.
Для визуального редактирования проводок в типовых конфигурациях используется общая обработка КорректировкаДвижений. Выясним, что нужно настроить, чтобы ваш новый документ появился в этой форме.
У обработки КорректировкаДвижений есть основной реквизит (чаще всего ДокументОбъект) с составным типом данных. Вам необходимо:
ДокументОбъект отметить галочкой ваш новый документ.Если этого не сделать, форма корректировки либо не откроется, либо не сможет корректно «прочитать» движения вашего документа, и вы увидите пустые таблицы вместо проводок.
Иногда разработчики пытаются решить проблему «в лоб», прописывая принудительную запись наборов записей. Рассмотрим пример такого кода, который не рекомендуется использовать на постоянной основе, но который демонстрирует механизм работы на низком уровне:
// Пример неоптимального решения (из сообщения №6 форума)
Если РучнаяКорректировка Тогда
Набор = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Ссылка);
Набор.Прочитать();
// Предполагается, что данные берутся из формы корректировки
Набор.Загрузить(ТаблицаИзФормы);
Набор.Записать(Истина);
КонецЕсли;
Почему это плохой путь? Такой код обходит стандартные механизмы транзакций платформы 1С. Это может привести к блокировкам данных, потере контроля целостности и сложностям при обновлении конфигурации. Правильный путь — это именно настройка свойств «Записывать модифицированные», как мы разобрали выше. В этом случае платформа сама поймет, какой набор записей нужно сохранить, когда пользователь нажмет «Записать» в форме корректировки.
Проанализируем ситуацию, когда документ делает записи не только в бухгалтерию (счета), но и в регистры накопления (например, НДС или взаиморасчеты). Часто пользователи жалуются: «Я поправил проводку на 44 счет, а в отчете по НДС цифры старые». Для оперативного исправления движений в различных регистрах в режиме предприятия можно использовать обработку для групповой корректировки записей регистров.
Это происходит потому, что в форме ручной корректировки пользователь изменил только вкладку «Хозрасчетный», но забыл перейти на вкладку соответствующего регистра накопления. При настройке документа важно:
ОбработкаПроведения все движения по всем регистрам обернуты в условие Если НЕ РучнаяКорректировка Тогда....Для того чтобы механизм ручной корректировки заработал в вашем документе, выполните следующие действия:
РучнаяКорректировка (Булево) в документ.ОбработкаПроведения добавьте выход из процедуры, если флаг установлен.КорректировкаДвижений.Соблюдение этих правил позволит вам избежать «исчезновения» ручных правок и обеспечит корректную работу документа в рамках типового функционала 1С:Бухгалтерии.