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