Как отобразить движения всех связанных документов в "РеализацияТоваровУслуг" по кнопке "Дт/Кт" в 1С:БП 3.0?

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

Когда вы работаете с документом РеализацияТоваровУслуг в 1С:Бухгалтерии Предприятия 3.0, стандартная кнопка "Дт/Кт" обычно показывает движения только текущего документа. Однако часто возникает необходимость увидеть движения всех документов, связанных с текущей реализацией, например, документы-основания, счета-фактуры или другие зависимые операции. В этом руководстве мы рассмотрим, как добиться такого поведения, предлагая два основных подхода: модификацию стандартного механизма открытия движений и создание собственного отчета.

Подход 1: Модификация стандартного поведения кнопки "Дт/Кт"

Стандартная кнопка "Дт/Кт" на форме документа обычно вызывает обработчик команды, который открывает форму списка регистра бухгалтерии (чаще всего Хозрасчетный), устанавливая отбор по текущему документу-регистратору. Наша задача — расширить этот отбор, включив в него не только текущий документ, но и все связанные с ним документы. Мы рассмотрим эту задачу пошагово.

  1. Выясняем, как открывается форма движений.

    Первым шагом нам необходимо определить, какая команда вызывается при нажатии кнопки "Дт/Кт" и какой обработчик выполняет открытие формы движений. В типовых конфигурациях 1С, таких как БП 3.0, это часто реализуется через общие команды или команды формы. Мы можем найти соответствующий обработчик команды формы документа РеализацияТоваровУслуг или общего модуля, который отвечает за показ движений. Обычно это команда "ДвиженияДокумента" или похожая.

  2. Получаем список связанных документов.

    Для получения списка связанных документов мы можем использовать различные механизмы 1С. Важно понимать, что "связанные документы" могут быть определены по-разному.

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

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

    Рассмотрим функцию, которая будет возвращать массив ссылок на связанные документы, используя КритерийОтбора.СвязанныеДокументы:

    
    Функция ОбъектыПоКритериюОтбора(ЗначениеКритерияОтбора) Экспорт
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |    СвязанныеДокументы.Ссылка
            |ИЗ
            |    КритерийОтбора.СвязанныеДокументы(&ЗначениеКритерияОтбора) КАК СвязанныеДокументы";
        Запрос.УстановитьПараметр("ЗначениеКритерияОтбора", ЗначениеКритерияОтбора);
        
        МассивСсылок = Новый Массив;
        Выборка = Запрос.Выполнить().Выбрать();
        Пока Выборка.Следующий() Цикл
            МассивСсылок.Добавить(Выборка.Ссылка);
        КонецЦикла;
        Возврат МассивСсылок;
    КонецФункции
    

    Эта функция вернет массив ссылок на все документы, которые система считает связанными с переданным ЗначениеКритерияОтбора.

  3. Модифицируем отбор при открытии формы.

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

    Для регистра бухгалтерии отбор устанавливается по полю Регистратор. Если мы хотим отбирать по нескольким регистраторам, то в значение отбора передаем Массив или СписокЗначений ссылок. Рассмотрим примерный код, который можно разместить в обработчике команды "Дт/Кт" документа РеализацияТоваровУслуг или в аналогичной функции, вызываемой при нажатии кнопки.

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

    Важно: модификацию типового поведения кнопки "Дт/Кт" следует выполнять через расширения конфигурации, чтобы сохранить возможность бесшовного обновления. Вы можете создать расширение, добавить в него форму документа РеализацияТоваровУслуг, переопределить обработчик команды "Дт/Кт" или создать свою команду и привязать ее к кнопке на форме.

Подход 2: Создание собственного внешнего отчета

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

  1. Создаем макет отчета.

    Откройте 1С:Предприятие в режиме конфигуратора. Создайте новый внешний отчет (Файл -> Новый -> Внешний отчет). Сохраните его в отдельный файл с расширением *.erf.

  2. Разрабатываем схему компоновки данных (СКД).

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

    Шаг 1: Добавляем набор данных "Запрос". В этом запросе выберите необходимые поля регистра бухгалтерии Хозрасчетный (Период, Регистратор, СчетДт, СубконтоДт, СчетКт, СубконтоКт, Сумма, Содержание и т.д.). Важнейшим условием будет отбор по полю Регистратор, в которое мы будем передавать список документов.

    
    ВЫБРАТЬ
        Хозрасчетный.Период,
        Хозрасчетный.Регистратор,
        Хозрасчетный.Регистратор.Представление КАК РегистраторПредставление, // Для удобства вывода
        Хозрасчетный.СчетДт,
        Хозрасчетный.СубконтоДт1 КАК СубконтоДт1,
        Хозрасчетный.СубконтоДт2 КАК СубконтоДт2,
        Хозрасчетный.СубконтоДт3 КАК СубконтоДт3,
        Хозрасчетный.СчетКт,
        Хозрасчетный.СубконтоКт1 КАК СубконтоКт1,
        Хозрасчетный.СубконтоКт2 КАК СубконтоКт2,
        Хозрасчетный.СубконтоКт3 КАК СубконтоКт3,
        Хозрасчетный.Сумма,
        Хозрасчетный.Содержание,
        Хозрасчетный.СуммаВВалюте,
        Хозрасчетный.ВалютаДт,
        Хозрасчетный.ВалютаКт,
        Хозрасчетный.КоличествоДт,
        Хозрасчетный.КоличествоКт
    ИЗ
        РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
    ГДЕ
        Хозрасчетный.Регистратор В (&СписокРегистраторов)
    

    Шаг 2: Добавляем параметры СКД. На вкладке "Параметры" добавьте следующие параметры:

    • ДокументРеализации (тип ДокументСсылка.РеализацияТоваровУслуг) — это будет основной параметр, куда пользователь будет указывать документ реализации.
    • СписокРегистраторов (тип Массив) — это внутренний параметр, который будет заполняться программно и использоваться в запросе. Уберите его из пользовательских настроек, так как он не должен быть видим пользователю.

    Шаг 3: Динамическое формирование списка регистраторов. Для заполнения параметра СписокРегистраторов, который будет использоваться в запросе, нам потребуется выполнить программный код перед формированием отчета. Это можно сделать в обработчике события ПриКомпоновкеРезультата модуля объекта отчета.

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

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

Важные нюансы и рекомендации

  1. Избегайте "перехвата" и записи движений.

    Как упоминалось в ходе обсуждения, попытка "перехватить" движения связанных документов и физически записать их в движения документа РеализацияТоваровУслуг является неправильным подходом. Движения документа формируются его алгоритмом проведения и должны отражать исключительно операции, выполненные самим документом. Запись "чужих" движений в документ приведет к искажению данных, проблемам с учетом и невозможности корректного анализа. Цель нашей задачи — именно отобразить эти движения, а не создать новые.

  2. Используйте расширения для модификации.

    При внесении изменений в типовую конфигурацию (например, для изменения поведения кнопки "Дт/Кт") строго рекомендуется использовать расширения. Это позволит сохранить конфигурацию на поддержке и избежать проблем при обновлении платформы или типового решения. Если вы измените типовой код напрямую, при следующем обновлении вам придется вручную переносить эти изменения, что может быть трудоемко и чревато ошибками.

  3. Особенности КритерийОтбора.СвязанныеДокументы.

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

  4. Производительность.

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

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

← На главную