Как реализовать создание бухгалтерских документов на выбранную пользователем дату в 1С

Программист 1С v8.3 (Управляемые формы) Управленческий учет Промышленность, строительство и АПК
← На главную

При работе с внешними обработками в системах на базе 1С (особенно в отраслевых решениях, таких как «БИТ.Строительство») часто возникает задача автоматизации создания бухгалтерских документов (БУ) на основании управленческих (УУ). Одной из ключевых потребностей пользователей является возможность самостоятельно указывать дату, которой будут созданы новые документы, независимо от даты исходного документа или текущего числа.

В этой статье мы подробно разберем, как модифицировать существующий механизм формирования бухгалтерских документов (ФБД), чтобы система учитывала выбранную на форме дату. Мы проанализируем код серверных процедур, работу со структурами параметров и внесение изменений в модули менеджера документов.

Разбор архитектуры механизма формирования документов

Прежде чем приступать к кодингу, давайте разберем, как обычно работает этот процесс. В специализированных конфигурациях процесс «трансляции» документов из одного вида учета в другой часто выносится в отдельные экспортные функции модулей менеджеров. Основная цепочка вызовов выглядит следующим образом:

  1. Внешняя обработка: пользователь выбирает документы и дату.
  2. Подготовка параметров: создается структура (Структура), в которую упаковываются ссылки на документы-основания и дополнительные настройки.
  3. Вызов функции формирования: вызывается метод (например, ОтобразитьВБухгалтерскийДокумент), который находится в модуле менеджера конкретного типа документа.
  4. Создание/обновление объекта: внутри функции создается новый объект документа, заполняется и записывается.

Шаг 1. Модификация структуры параметров

Для начала нам необходимо расширить перечень данных, которые передаются из обработки в серверную часть. Рассмотрим стандартную функцию, которая инициализирует структуру параметров. В модуле стр_ОМТС_Сервер (или аналогичном) найдем функцию ФБД_ПараметрыДляОтображенияВБухДокумент.

Нам нужно добавить в эту структуру новое поле, например, ДатаДокументаБУ. Давайте посмотрим, как это должно выглядеть:


Функция ФБД_ПараметрыДляОтображенияВБухДокумент() Экспорт
    ПараметрыДляОтображения = Новый Структура;
    ПараметрыДляОтображения.Вставить("Документ", Неопределено);
    ПараметрыДляОтображения.Вставить("БухДокументСсылка", Неопределено);
    ПараметрыДляОтображения.Вставить("БухДокументСсылкаДав", Неопределено);
    ПараметрыДляОтображения.Вставить("СПартиями", Ложь);
    // Добавляем новый параметр для хранения выбранной даты
    ПараметрыДляОтображения.Вставить("ДатаДокументаБУ", '00010101'); 
    
    Возврат ПараметрыДляОтображения;
КонецФункции

Важный момент: инициализация пустой датой '00010101' позволяет нам в дальнейшем проверить, была ли дата передана пользователем или ее нужно оставить по умолчанию.

Шаг 2. Передача даты из экранной формы в обработку

Теперь рассмотрим процедуру на сервере, которая запускается при нажатии кнопки «Создать документы БУ». Нам необходимо считать значение из реквизита формы (например, Объект.ДатаСоздания или напрямую из элемента управления Элементы.ДатаСозданияБУ.ПутьКДанным) и поместить его в нашу структуру.

Проанализируем фрагмент кода основной обработки:


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

В этом блоке кода мы обращаемся к коллекции Документы динамически, используя имя метаданных документа управленческого учета. Это позволяет одной обработке создавать разные типы бухгалтерских документов (Поступления, Списания и т.д.).

Шаг 3. Изменение логики в модуле менеджера документа

Это самый ответственный этап. Нам нужно зайти в Модуль менеджера того документа, который создается (например, ПоступлениеТоваровУслуг или специализированный документ БИТ). Там необходимо найти экспортную функцию ОтобразитьВБухгалтерскийДокумент.

Внутри этой функции происходит создание объекта. Нам нужно вклиниться в процесс заполнения реквизитов объекта. Рассмотрим пример логики внутри менеджера:


Функция ОтобразитьВБухгалтерскийДокумент(ПараметрыДляОтображения, ОшибкаОтображения) Экспорт
    
    // Определяем, создаем мы новый документ или редактируем существующий
    Если ЗначениеЗаполнено(ПараметрыДляОтображения.БухДокументСсылка) Тогда
        ДокументОбъект = ПараметрыДляОтображения.БухДокументСсылка.ПолучитьОбъект();
    Иначе
        ДокументОбъект = Документы.НазваниеВашегоДокумента.СоздатьДокумент();
    КонецЕсли;

    // ... (стандартная логика заполнения реквизитов из УУ) ...

    // Установка даты из параметров
    Если ЗначениеЗаполнено(ПараметрыДляОтображения.ДатаДокументаБУ) Тогда
        ДокументОбъект.Дата = ПараметрыДляОтображения.ДатаДокументаБУ;
        // Важно: при изменении даты может потребоваться переустановка номера
        ДокументОбъект.УстановитьНовыйНомер(); 
    КонецЕсли;

    // Попытка записи и проведения
    Попытка
        ДокументОбъект.Записать(РежимЗаписиДокумента.Запись); // Или Проведение
        Возврат Истина;
    Исключение
        ОшибкаОтображения = ОписаниеОшибки();
        Возврат Ложь;
    КонецПопытки;
    
КонецФункции

Тонкости и нюансы работы с датами

При программной установке даты документа следует учитывать несколько критически важных факторов, которые могут привести к ошибкам в учетной системе:

  1. Граница периода и нумерация: если в вашей конфигурации настроена периодичность нумерации (например, «Месяц»), а вы меняете дату документа с одного месяца на другой, старый номер может стать невалидным или нарушить хронологию. Всегда вызывайте УстановитьНовыйНомер() после присвоения новой даты.
  2. Дата запрета изменения: внешние обработки часто обходят стандартные проверки форм. Перед установкой даты обязательно выполните проверку: ДатыЗапретаИзменения.Проверить(ДокументОбъект.Дата). Это защитит закрытые периоды бухгалтерии от случайных корректировок.
  3. Блокировки данных: обратите внимание на использование объекта БлокировкаДанных в исходном коде. Если вы массово создаете документы в транзакции, убедитесь, что блокировка устанавливается по ключевым измерениям (например, по ссылке на УУ документ), чтобы избежать конфликтов с другими пользователями.
  4. Транзакции: в примере кода используется НачатьТранзакцию() внутри цикла. Помните, что если один документ из ста не создастся, и вы вызовете ОтменитьТранзакцию(), то работа по текущему документу будет откачена. Это правильный подход для обеспечения целостности связи между УУ и БУ.

Итоги

Мы проанализировали процесс передачи пользовательской даты через структуру параметров в модуль менеджера. Этот подход является наиболее «чистым» с точки зрения архитектуры 1С, так как он не нарушает инкапсуляцию логики формирования документа внутри его менеджера, но при этом дает гибкость внешней обработке.

Резюмируя шаги: расширяем структуру в серверном модуле, заполняем ее на форме и обрабатываем значение в модуле менеджера объекта. Такой подход гарантирует, что ваши бухгалтерские документы всегда будут создаваться именно в том периоде, который необходим для корректного закрытия отчетности.

← На главную