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