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

Программист 1С v8.3 (Управляемые формы)
← К списку

Нам часто приходится создавать новые документы в 1С, используя данные из уже существующих. Платформа 1С предоставляет мощный и удобный механизм заполнения документа на основании другого. Этот функционал значительно сокращает время на ввод информации и минимизирует вероятность ошибок, так как часть данных автоматически переносится из документа-основания. Однако иногда пользователи сталкиваются с тем, что новый документ не заполняется так, как ожидалось. Давайте вместе разберем основные причины и способы решения этой проблемы.

Важность записи документа-основания перед созданием на основании

Одна из самых распространенных причин некорректного или неполного заполнения нового документа кроется в состоянии документа-основания. Мы часто забываем об одном ключевом моменте: для того чтобы данные из исходного документа были доступны для переноса, этот документ должен быть сохранен в базе данных.

Рассмотрим ситуацию подробнее. Когда вы создаете новый документ на основании существующего, система обращается к данным документа-основания, которые хранятся в базе. Если исходный документ был только что создан или изменен, но еще не записан, то его актуальные данные могут быть недоступны для операции заполнения. Система может либо не найти нужных данных, либо использовать устаревшие, если документ был записан ранее, но затем изменен без повторной записи.

Что же нам нужно сделать? Всегда убедитесь, что документ, который вы используете как основание, был успешно записан.

  1. Откройте документ-основание (например, ЗаказПокупателя).
  2. Внесите все необходимые изменения.
  3. Обязательно нажмите кнопку "Записать" или "Провести", чтобы сохранить все изменения в базе данных.
  4. Только после этого создавайте на его основании новый документ (например, РеализацияТоваровУслуг).

Этот простой, но критически важный шаг гарантирует, что при вызове механизма заполнения на основании, новый документ получит актуальные и полные данные из своего предшественника.

Программное заполнение документа на основании другого

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

Ключевым методом для программного заполнения является метод Заполнить(). Этот метод вызывается у нового, еще не записанного объекта документа и принимает в качестве параметра ссылку на документ-основание.

Давайте разберем по шагам, как это работает и какой механизм задействуется внутри платформы.

  1. Создание нового объекта документа: Сначала мы создаем новый экземпляр объекта документа, который хотим заполнить.
    
    НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
    
  2. Вызов метода Заполнить(): Затем мы вызываем метод Заполнить() для этого нового документа, передавая ему ссылку на документ-основание.
    
    СсылкаНаОснование = Документы.ЗаказПокупателя.НайтиПоНомеру("00000001", Дата("20230101")); // Пример получения ссылки
    Если СсылкаНаОснование <> Неопределено Тогда
        НовыйДокумент.Заполнить(СсылкаНаОснование);
    КонецЕсли;
    

    Метод Заполнить() инициирует процесс переноса данных.

  3. Событие ОбработкаЗаполнения: Самое интересное происходит внутри метода Заполнить(). Он вызывает специальный обработчик события ОбработкаЗаполнения. Этот обработчик является стандартным механизмом платформы 1С и располагается в модуле объекта документа. Именно в этом обработчике разработчик конфигурации определяет, какие данные и как должны переноситься из документа-основания в новый документ.

    Мы можем посмотреть на структуру этого обработчика. Он принимает два параметра:

    • ДокументОснование: ссылка на документ, который является основанием для заполнения.
    • ДанныеЗаполнения: структура, которую можно использовать для передачи дополнительных параметров при заполнении.
    
    // Пример кода в модуле объекта документа "РеализацияТоваровУслуг"
    Процедура ОбработкаЗаполнения(ДокументОснование, ДанныеЗаполнения)
    
        // Вызываем стандартную обработку заполнения, если она есть в родительских объектах
        // Например, для типовых подсистем или общих модулей.
        СтандартнаяОбработка = Истина;
        // Условный вызов типовой подсистемы, которая может заполнять часть данных
        // ОбменДанными.ЗаполнитьИзДокументаОснования(ЭтотОбъект, ДокументОснование, СтандартнаяОбработка);
    
        Если Не СтандартнаяОбработка Тогда
            Возврат;
        КонецЕсли;
    
        // Здесь начинается наша пользовательская логика заполнения
        // Мы можем получить данные из документа-основания
        Если ТипЗнч(ДокументОснование) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
            // Получаем объект документа-основания, чтобы прочитать его данные
            ОбъектОснование = ДокументОснование.ПолучитьОбъект();
    
            // Пример заполнения реквизитов шапки нового документа
            ЭтотОбъект.Контрагент = ОбъектОснование.Контрагент;
            ЭтотОбъект.ДоговорКонтрагента = ОбъектОснование.ДоговорКонтрагента;
            ЭтотОбъект.Организация = ОбъектОснование.Организация;
            ЭтотОбъект.Комментарий = "Создан на основании Заказа покупателя №" + ОбъектОснование.Номер + " от " + Формат(ОбъектОснование.Дата, "ДФ=dd.MM.yyyy");
    
            // Пример заполнения табличной части
            Для Каждого СтрокаЗаказа Из ОбъектОснование.Товары Цикл
                НоваяСтрока = ЭтотОбъект.Товары.Добавить();
                НоваяСтрока.Номенклатура = СтрокаЗаказа.Номенклатура;
                НоваяСтрока.Количество = СтрокаЗаказа.Количество;
                НоваяСтрока.Цена = СтрокаЗаказа.Цена;
                НоваяСтрока.Сумма = СтрокаЗаказа.Сумма;
                // Можем добавить и другие реквизиты
            КонецЦикла;
    
        ИначеЕсли ТипЗнч(ДокументОснование) = Тип("ДокументСсылка.СчетНаОплатуПокупателю") Тогда
            // Логика заполнения, если основание - Счет на оплату
            // ...
        КонецЕсли;
    
    КонецПроцедуры
    

    Таким образом, если вы столкнулись с тем, что программное заполнение не дает ожидаемого результата, мы рекомендуем проанализировать код в процедуре ОбработкаЗаполнения целевого документа. Возможно, там не реализована нужная вам логика или есть ошибки.

  4. Дополнительные действия: После вызова Заполнить(), новый документ будет содержать перенесенные данные. Мы можем внести дополнительные корректировки и затем записать или провести документ.
    
    // После заполнения, можем внести свои корректировки
    НовыйДокумент.Ответственный = Пользователи.ТекущийПользователь();
    НовыйДокумент.Дата = ТекущаяДата();
    
    // Записываем или проводим документ
    НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
    

Итак, мы выяснили, что успешное заполнение документа на основании другого в 1С зависит от двух ключевых факторов: состояния документа-основания (он должен быть записан) и корректной реализации логики в процедуре ОбработкаЗаполнения, будь то стандартная конфигурация или ваши доработки. Учитывая эти моменты, вы сможете эффективно использовать этот мощный механизм платформы 1С.

← К списку