Как вывести номер и дату счета-фактуры в список документов реализации и поступления?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Бухгалтерский учет Торговля и дистрибуция
← На главную

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

Вариант 1. Обычные формы: использование события ПриПолученииДанных

В обычных формах (толстый клиент, например в конфигурациях уровня 1С:Управление торговлей 10.3 или 1С:Бухгалтерия предприятия 2.0) отображение списка строится на табличном поле. Первое решение, которое часто приходит на ум разработчикам, — задействовать обработчик СписокПриВыводеСтроки. Однако этот подход содержит скрытую проблему производительности.

Проанализируем ситуацию: если выполнять запрос к базе данных внутри процедуры СписокПриВыводеСтроки, платформа будет отправлять запрос на сервер для каждой отдельной строки на экране (классическая проблема запросов N+1). Это приводит к заметным зависаниям интерфейса при прокрутке списка колесом мыши.

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

Разберем реализацию по шагам:

  1. Добавим в табличное поле списка новую колонку (например, с именем НомерСФ) и снимем для нее флаг Данные, чтобы значение не считывалось автоматически.
  2. В свойствах табличного поля назначим обработчик события ПриПолученииДанных.
  3. Напишем код пакетного получения данных и заполнения ячеек:

Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
    
    МассивСсылок = Новый Массив;
    СоответствиеСтрок = Новый Соответствие;
    
    Для Каждого Оформление Из ОформленияСтрок Цикл
        МассивСсылок.Добавить(Оформление.ДанныеСтроки.Ссылка);
        СоответствиеСтрок.Вставить(Оформление.ДанныеСтроки.Ссылка, Оформление);
    КонецЦикла;
    
    Если МассивСсылок.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   СФ.ДокументОснование КАК ДокументОснование,
        |   СФ.Номер КАК НомерСФ,
        |   СФ.Дата КАК ДатаСФ
        |ИЗ
        |   Документ.СчетФактураВыданный КАК СФ
        |ГДЕ
        |   СФ.ДокументОснование В(&МассивСсылок)
        |   И СФ.Проведен";
        
    Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        ТекущееОформление = СоответствиеСтрок[Выборка.ДокументОснование];
        Если ТекущееОформление <> Неопределено Тогда
            ТекущееОформление.Ячейки.НомерСФ.УстановитьТекст(СокращенныйНомер(Выборка.НомерСФ) + " от " + Формат(Выборка.ДатаСФ, "ДФ=dd.MM.yyyy"));
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

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

Вариант 2. Управляемые формы: произвольный запрос динамического списка

В управляемом приложении форма списка документов работает на основе объекта ДинамическийСписок. Здесь задача решается редактированием текста запроса списка. Выясним причину, почему нельзя просто сделать ЛЕВОЕ СОЕДИНЕНИЕ с табличной частью счета-фактуры или самим документом напрямую.

Если к одной реализации было оформлено несколько счетов-фактур (например, корректировочный, исправительный или ошибочно введенный дубль), прямое соединение приведет к задвоению строк реализации в журнале. Чтобы этого не произошло, необходимо связывать список со свернутым подзапросом.

Посмотрим на пример построения безопасного запроса для динамического списка:


ВЫБРАТЬ
    ДокументРеализация.Ссылка КАК Ссылка,
    ДокументРеализация.ПометкаУдаления КАК ПометкаУдаления,
    ДокументРеализация.Номер КАК Номер,
    ДокументРеализация.Дата КАК Дата,
    ДокументРеализация.Проведен КАК Проведен,
    ДокументРеализация.Контрагент КАК Контрагент,
    ДокументРеализация.СуммаДокумента КАК СуммаДокумента,
    СчетаФактуры.Номер КАК НомерСФ,
    СчетаФактуры.Дата КАК ДатаСФ
ИЗ
    Документ.РеализацияТоваровУслуг КАК ДокументРеализация
    ЛЕВОЕ СОЕДИНЕНИЕ (
        ВЫБРАТЬ
            СФ.ДокументОснование КАК ДокументОснование,
            МАКСИМУМ(СФ.Номер) КАК Номер,
            МАКСИМУМ(СФ.Дата) КАК Дата
        ИЗ
            Документ.СчетФактураВыданный КАК СФ
        ГДЕ
            СФ.Проведен
        СГРУППИРОВАТЬ ПО
            СФ.ДокументОснование
    ) КАК СчетаФактуры
    ПО ДокументРеализация.Ссылка = СчетаФактуры.ДокументОснование

После изменения запроса в свойствах динамического списка новые поля НомерСФ и ДатаСФ перетаскиваются в дерево элементов формы. В отличие от обычных форм, в управляемом приложении по этим колонкам сразу будут работать стандартный поиск, группировки и сортировка платформы.

Вариант 3. Оптимальная архитектура через вспомогательный регистр сведений

Если база данных имеет значительный объем (сотни тысяч или миллионы документов), подзапросы в динамических списках могут создавать дополнительную нагрузку на сервер СУБД. Проанализируем более быстродействующее архитектурное решение — использование вспомогательного регистра сведений.

  1. Создаем непериодический независимый регистр сведений (например, СчетаФактурыДокументов).
  2. Назначаем измерением ДокументОснование (тип: определяемый тип или ссылка на документ реализации/поступления).
  3. Ресурсами делаем СчетФактура, НомерСФ (строка) и ДатаСФ (дата).
  4. В модуле объекта документа СчетФактураВыданный (в событиях ОбработкаПроведения и ОбработкаУдаленияПроведения) прописываем обновление записей этого регистра.
  5. В динамическом списке делаем прямое соединение 1:1 по первичному ключу регистра сведений.

Такой подход обеспечивает мгновенную выборку, индексное обращение без тяжелых подзапросов и сохраняет динамическое считывание порций данных СУБД без снижения отзывчивости интерфейса.

Вариант 4. Доработка без снятия с поддержки и типовые журналы

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

  1. Проверка типовых журналов: во многих современных версиях 1С (ERP, КА, УТ 11, БП 3.0) номер и дата счета-фактуры, а также состояние УПД уже выведены в единых журналах (например, «Документы реализации (акты, накладные, УПД)» или «Журнал операций»). Часто достаточно переключить пользователей на работу с общим журналом вместо отдельной формы списка накладных.
  2. Использование механизма расширений конфигурации: форму списка документов можно добавить в расширение. В расширении переопределяется текст запроса динамического списка и добавляются необходимые элементы интерфейса, благодаря чему основная конфигурация остается на стандартном обновлении.
← На главную