Как настроить вкладки товаров и услуг в реализации БП 3.0 и получить данные через COM-соединение

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

При работе с типовой конфигурацией 1С:Бухгалтерия предприятия 3.0 пользователи и разработчики часто сталкиваются с двумя распространенными задачами: разделением номенклатуры на товары и услуги в одном документе реализации, а также программным чтением строк табличной части через внешнее COM-соединение.

Разберем обе эти задачи по шагам, выясним причины типичных ошибок при работе через COM и рассмотрим правильные варианты реализации.

Отображение раздельных вкладок «Товары» и «Услуги» в реализации

В документе РеализацияТоваровУслуг состав и видимость закладок на форме напрямую зависят от реквизита ВидОперации. По умолчанию при создании документа с видом операции «Товары (накладная)» или «Услуги (акт)» доступна только одна соответствующая табличная часть.

Чтобы в одном документе одновременно появились вкладки для товаров и услуг, выполним следующие действия:

  1. Откроем нужный документ Реализация (акт, накладная).
  2. Нажмем на гиперссылку вида операции в шапке документа (или перейдем в меню Еще — Изменить вид операции).
  3. Выберем вариант Товары, услуги, комиссия.

После смены вида операции на форме документа станут доступны отдельные вкладки Товары, Услуги, Возвратная тара и Агентские услуги, что позволяет оформить комплексную отгрузку в рамках одного документа.

Особенности чтения ссылочных данных и перечислений через COM-соединение

При попытке обойти табличную часть полученного по COM документа разработчики часто сталкиваются с тем, что вывод значений возвращает строку вида "COMОбъект" или вызывает ошибку Поле объекта не обнаружено (Наименование).

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

Способ 1. Получение представлений и свойств через методы соединения

Если требуется получить строковое представление номенклатуры или значения перечисления (например, ставки НДС), обратимся к контекстным методам глобального контекста удаленной базы через объект соединения:

  1. Для ссылочных типов (справочники, документы) вызовем метод String() объекта соединения: ИмяНоменклатуры = Соединение.String(РеалТов.Номенклатура);
  2. Для перечислений или получения системного идентификатора используем вызов XMLСтрока(): ИмяСтавкиНДС = Соединение.XMLСтрока(РеалТов.СтавкаНДС);
  3. При прямом обращении к реквизиту РеалТов.Номенклатура.Наименование важно убедиться, что ссылка в строке не является пустой, не содержит NULL или Неопределено, иначе платформой будет вызвано исключение.

Способ 2. Оптимальное чтение через объект «Запрос» в удаленной базе

Построчное чтение табличной части через точку в COM-соединении порождает огромное количество межпроцессных вызовов (RPC), что значительно замедляет работу алгоритма. Наиболее эффективный подход — сформировать и выполнить Запрос целиком на стороне удаленной базы данных.

Посмотрим на пример правильной организации выборки:


ЗапросCOM = Соединение.NewObject("Запрос");
ЗапросCOM.Текст = 
    "ВЫБРАТЬ
    |   ТабЧасть.Номенклатура.Наименование КАК НаименованиеНоменклатуры,
    |   ПРЕДСТАВЛЕНИЕ(ТабЧасть.СтавкаНДС) КАК СтавкаНДСПредставление,
    |   ТабЧасть.Количество КАК Количество,
    |   ТабЧасть.Сумма КАК Сумма
    |ИЗ
    |   Документ.РеализацияТоваровУслуг.Товары КАК ТабЧасть
    |ГДЕ
    |   ТабЧасть.Ссылка = &СсылкаДокумента";

ЗапросCOM.УстановитьПараметр("СсылкаДокумента", ДокументСсылкаCOM);
Выборка = ЗапросCOM.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    Сообщить("Номенклатура: " + Выборка.НаименованиеНоменклатуры);
    Сообщить("Ставка НДС: " + Выборка.СтавкаНДСПредставление);
    Сообщить("Количество: " + Выборка.Количество);
КонецЦикла;

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

← На главную