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

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

В типовых конфигурациях 1С, таких как «Бухгалтерия предприятия» или «ERP», связь между документами отгрузки и счетами-фактурами реализована по принципу «снизу вверх». Это означает, что СчетФактураВыданный содержит ссылку на документ-основание (например, РеализацияТоваровУслуг), но сама Реализация «не знает» о существовании счета-фактуры в своих реквизитах. Такая архитектура выбрана неслучайно: один счет-фактура может быть выписан на несколько реализаций (сводный документ), и хранение прямой ссылки в реализации привело бы к логическим противоречиям.

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

Почему не стоит добавлять реквизит напрямую в документ

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

  1. Блокировки данных: При записи счета-фактуры система будет пытаться заблокировать и перезаписать объект реализации. Если в этот момент другой пользователь редактирует ту же реализацию, возникнет конфликт.
  2. Модифицированность формы: Если форма реализации открыта у пользователя, программное изменение её данных приведет к тому, что при закрытии система выдаст вопрос: «Данные были изменены. Сохранить изменения?», что крайне раздражает бухгалтеров.
  3. Нарушение типовой логики: В случае удаления счета-фактуры или его перевыбора вам придется писать сложную логику очистки реквизитов во всех связанных документах.

Способ 1. Использование механизма «Характеристики» для отчетов СКД

Это самый элегантный способ, который позволяет «виртуально» добавить поле счета-фактуры к реализации в любых отчетах на базе Системы компоновки данных (СКД), не меняя структуру таблиц самого документа. Рассмотрим этот алгоритм по шагам:

Выясним причину, по которой этот метод считается приоритетным: он не требует изменения объекта РеализацияТоваровУслуг и работает на уровне метаданных отчетов.

  1. Откроем конфигуратор и найдем документ РеализацияТоваровУслуг.
  2. Перейдем на вкладку «Данные» и нажмем кнопку «Характеристики».
  3. В появившемся окне настроим получение данных. В качестве источника можно указать запрос к регистру сведений (если вы решите использовать его для хранения связи) или напрямую запрос к таблице СчетФактураВыданный.ДокументыОснования.
  4. После настройки в любом типовом отчете, где есть поле Реализация, при нажатии на «плюсик» в списке доступных полей появится виртуальное поле Счет-фактура (или то имя, которое вы задали).

Способ 2. Использование регистра сведений «Дополнительные сведения»

Если вам необходимо физически хранить связь, но вы не хотите менять структуру документа, проанализируем использование типового механизма «Дополнительные сведения».

В 1С существует регистр сведений ДополнительныеСведения. Мы можем программно записывать туда ссылку на счет-фактуру, используя РеализацияТоваровУслуг как объект-владелец. Рассмотрим пример кода, который можно разместить в модуле объекта СчетФактураВыданный в процедуре ПриЗаписи:


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

Преимущество этого метода в том, что дополнительные сведения автоматически подтягиваются во многие типовые отчеты и списки документов без дополнительного программирования.

Способ 3. Программное обновление открытой формы реализации

Рассмотрим ситуацию, когда вам все же необходимо обновить форму реализации при создании счета-фактуры (например, чтобы в форме реализации сразу отобразился статус «Выставлен счет-фактура»). Основная проблема здесь — избежать вопроса о сохранении изменений.

Посмотрим на пример решения через механизм оповещений. В форме счета-фактуры после записи вызываем метод Оповестить:


&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    Оповестить("ЗаписанСчетФактура", Объект.ДокументОснование, ЭтотОбъект);
КонецПроцедуры

В форме документа РеализацияТоваровУслуг необходимо создать обработчик события ОбработкаОповещения. Разберем по шагам, как это работает:


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "ЗаписанСчетФактура" И Параметр = Объект.Ссылка Тогда
        // Проверяем, не менял ли пользователь что-то в реализации
        Если Не ЭтаФорма.Модифицированность Тогда
            // Просто перечитываем данные с сервера
            ЭтаФорма.Прочитать();
        Иначе
            // Если форма изменена, просто обновляем визуальные элементы
            // без перезаписи основного объекта
            ОбновитьСтатусСчетаФактурыНаФорме();
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Важный нюанс: Использование ЭтаФорма.Модифицированность = Ложь (как советовали в сообщении 23) позволяет «обмануть» систему, чтобы она не задавала вопросов при закрытии. Однако используйте это с осторожностью: если пользователь действительно вносил изменения, они могут быть потеряны при вызове Прочитать().

Способ 4. Современный подход через расширения и УПД

Проанализируем ситуацию в современных версиях 1С (БП 3.0, ERP). В них реализован функционал Универсального передаточного документа (УПД). Когда в реализации включен тумблер «УПД», счет-фактура создается автоматически «под капотом», а его номер совпадает с номером реализации.

Если же ваша задача — именно вывод в отчеты, рекомендуется использовать Расширения конфигурации:

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

Резюме

Мы рассмотрели несколько подходов к связке реализации и счета-фактуры. Подведем итоги:

Помните, что в 1С данные должны быть нормализованы. Хранение одной и той же информации (номера СФ) в двух разных местах (в самом СФ и в связанной реализации) всегда ведет к риску рассинхронизации данных.

← На главную