Варианты применения СКД вне отчетов в отраслевых конфигурациях

Публикация № 1552862 18.11.21

Приемы и методы разработки - СКД

Директор и ведущий разработчик компании «Арт Порт» Максим Артеменко выступил на митапе, посвященном практике применения СКД. Максим рассказал о вариантах применения механизма настроек СКД для решения нестандартных задач – визуального оформления, сегментирования данных и автоматического заполнения примечаний к документам.

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

 

 

Нашей группе компаний более 25 лет, и 10 из них мы автоматизируем транспортный и зерновой бизнес.

Находимся на юге Украины, работаем с ближним зарубежьем.

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

Для этих задач мы реализовали 10 отраслевых решений. И сегодня я хочу рассказать об интересных вариантах применения СКД в них.

 

Варианты применения СКД в отраслевых решениях

 

 

У нас в отраслевых решения мы применяем СКД для следующих случаев:

  • Для сегментирования данных через отборы. Например, у нас есть определенный набор данных – допустим, какие-то справочники – нам нужно с помощью СКД и определенных отборов разобрать их на сегменты и в зависимости от этого что-то сделать.

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

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

 

Визуализация вагонов в табличном документе

 

 

Начнем с визуализации в табличном документе.

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

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

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

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

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

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

 

 

Эта же СКД используется для нового справочника «Варианты оформления вагонов» - в нем хранятся настройки СКД.

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

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    ТекущийОбъект.ПользовательскиеНастройки = Новый ХранилищеЗначения(КомпоновщикНастроек.ПолучитьНастройки());
КонецПроцедуры

Во всех подобных решениях мы используем одинаковый принцип сохранения настроек. Мы это делаем через хранилище значений.

  • У нас в макете обработки «АртсофтАРМДиспетчера» есть схема компоновки данных. В обработчике «ПриСозданииНаСервере» формы справочника «Варианты оформления вагонов», мы из этой обработки через команду ПолучитьМакет получаем схему компоновки данных и помещаем ее во временное хранилище.

  • Адрес этого временного хранилища передается для инициализации компоновщика настроек.

  • В реквизит формы КомпоновщикНастроек загружаются настройки по умолчанию, полученные из схемы.

  • Если это не новый элемент справочника, и пользовательские настройки в нем уже сохранены, мы в КомпоновщикНастроек загружаем их.

  • И потом, в обработчике «ПередЗаписьюНаСервере» происходит сохранение этих пользовательских настроек через хранилище значения.

Я думаю, что этот принцип многие используют.

 

 

В самом справочнике «Варианты оформления отчетов» у нас из всего компоновщика настроек выведено на форму только условное оформление.

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

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

 

 

И тут мы второй раз используем СКД: на форму выведено поле «Выбор» из компоновщика настроек – в нем мы можем выбрать поле объекта и потом заполнить табличную часть всеми его возможными значениями.

Работает это так: в поле «Выбор» пользователь выбирает поле определенного перечисления или справочника, нажимает ОК, и в таблице заполняются все возможные значения этого объекта.

 

 

Дальше он добавляет в таблицу колонки с оформлением – цвет фона, цвет границы. Таким образом, итоговую таблицу вариантов оформления вагонов мы формируем намного проще.

Например, мы выбираем в поле «Выбор» значение «Разметка», и тут у нас подставляются все разметки – направления, куда вагон можно отправить (страны СНГ, Россия, Украина и так далее).

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

После этого настройки сохраняются, и я покажу, что происходит с ними дальше.

 

Принцип накладывания условного оформления вагонов

 

После того как мы в «Рабочем месте диспетчера» получаем результат СКД по вагонам, мы рисуем табличный документ и начинаем каждый вагон выводить в цикле:

  • выводим вагон на определенный путь;

  • выводим в ячейку, объединяем;

  • выводим текст;

  • и применяем к каждому вагону на пути полученное оформление.

Разберем код, который отвечает за условное оформление.

Функция ПолучитьТабличныйДокументОформленияВагонов()
    ТабличныйДокумент = Новый ТабличныйДокумент;
    Если ЗначениеЗаполнено(ВариантОформленияВагонов) Тогд
        СхемаКомпоновкиДанных = ПолучитьИзВременногоХранилища(АдресСКДОтбораВагонов);
        НастройкиВариантаОформления = ВариантОформленияВагонов.ПользовательскиеНастройки.Получить();
        Если НастройкиВариантаОформления <> Неопределено Тогда
            НастройкиВариантаОформления.Структура.Очистить();
            ДетальныеЗаписи = НастройкиВариантаОформления.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
            ДетальныеЗаписи.Имя = "Детальные";
            ДетальныеЗаписи.Использование = Истина;
            ВыбранноеПоле = ДетальныеЗаписи.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
            ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Вагон");
            // Добавление отступа во все элементы оформления для определения выполнения условия оформления
            // На схеме отступ не отображается, а используется для установки значений оформления для вагона по умолчанию
            Для каждого Элемент Из НастройкиВариантаОформления.УсловноеОформление.Элементы Цикл
                Элемент.Оформление.УстановитьЗначениеПараметра("Отступ", 1);
            КонецЦикла;
            ВыбранныеВагоныВСКД = НастройкиВариантаОформления.ПараметрыДанных.Элементы.Добавить();
            ВыбранныеВагоныВСКД.Параметр = Новый ПараметрКомпоновкиДанных("МассивВыделяемыхВагонов");
            ВыбранныеВагоныВСКД.Использование = Истина;
            ВыбранныеВагоныВСКД.Значение = ПолучитьМассивВагоновПунктаДетализации();
            КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
            МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиВариантаОформления,,, Тип("ГенераторМакетаКомпоновкиДанных"));
            ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
            ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
            ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
            ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
            ПроцессорВывода.Вывести(ПроцессорКомпоновки);
        КонецЕсли;
    КонецЕсли;
    Возврат ТабличныйДокумент;
КонецФункции // ПолучитьТабличныйДокументОформленияВагонов()

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

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

  • мы создаем чистый табличный документ;

  • из варианта оформления вагонов, выбранного на форме, получаем вариант настроек (клиент может выбрать раскраску по собственникам, по грузам и т.д.);

  • искусственно добавляем в схему группировку по детальным записям, куда в выбранные поля добавляем поле «Вагон»;

  • далее мы искусственно добавляем в существующее условное оформление отступ 1 – это нужно для того, чтобы мы потом смогли найти конкретные вагоны, которые по условию нужно раскрасить. Потому что даже если в этом табличном документе мы вагоны раскрасили, когда мы выводим их в самой обработке, нам нужно понять, выполняется ли для конкретного вагона условие или нет – чтобы это понять, мы добавляем отступ.

  • выполняем схему компоновки данных с условным оформлением и выводим ее в табличный документ;

  • и дальше этот табличный документ возвращается в кусок кода, где выполняется обработка и вывод этих вагонов

&НаСервере
Функция ПолучитьОформлениеВагона(ВагонПредставление, ТабличныйДокументОформления)
    Оформление = Новый Структура("ГраницаСверху, ГраницаСлева, ГраницаСнизу, ГраницаСправа, Узор, ЦветРамки, ЦветТекста, ЦветУзора, ЦветФона, Шрифт",
                                  АртсофтВизуализацияКлиентСервер.Линия3(), АртсофтВизуализацияКлиентСервер.Линия3(), АртсофтВизуализацияКлиентСервер.Линия3(), АртсофтВизуализацияКлиентСервер.Линия3(),
                                  ТипУзораТабличногоДокумента.БезУзора, WebЦвета.Черный, WebЦвета.Черный, WebЦвета.Белый, WebЦвета.Белый, Новый Шрифт(, 8));
    Область = ТабличныйДокументОформления.НайтиТекст(ВагонПредставление);
    Если Область <> Неопределено Тогда
        Если Область.Отступ = 1 Тогда // Программно установленный отступ 1 - признак выполнения отбора условия оформления
            ЗаполнитьЗначенияСвойств(Оформление, Область);
        КонецЕсли;
        Оформление.Шрифт = Новый Шрифт(Область.Шрифт,, 8);
    КонецЕсли;
    Возврат Оформление;
КонецФункции // ПолучитьОформлениеВагона()

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

  • Мы создаем структуру на все необходимые элементы оформления (цвет, граница и т.д.), чтобы потом через «ЗаполнитьЗначенияСвойств» передать все свойства в область.

  • Потом в табличном документе, куда у нас выведен отчетом с раскрашенными вагонами, мы ищем по тексту номер вагона.

  • Если мы его нашли в табличном документе, мы проверяем – действительно ли это вагон, который нам нужен, с отступом 1.

  • Если отступ равен 1, то мы из этой области копируем значения в структуру и эту структуру возвращаем – из нее область, куда мы выводим вагон, получает все параметры оформления.

 

 

В итоге мы получаем вот такой результат – вы видите, что по-разному раскрашены рамки, различается цвет вагонов и так далее.

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

 

Группировка вагонов через выбор полей

 

Второй кейс используется в том же самом «Рабочем месте диспетчера».

 

 

Здесь возникла другая задача: когда диспетчеры работают с вагонами, их интересуют не номера, а группы вагонов. Например, 10 вагонов с пшеницей, 2 пустых вагона и еще 20 вагонов с углем. Поэтому возникла необходимость в группировке вагонов.

Сначала нужно было группировать по клиенту, а потом возникла задача группировать по собственникам и так далее. Этот механизм мы тоже решили реализовать с помощью СКД, но эту задачу мы делали уже чуть-чуть по-другому.

 

 

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

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

 

 

Мы решили эту задачу следующим образом – создали отдельный справочник для хранения настроек, назвали его «Варианты группировки вагонов» – в нем, в отличие от предыдущего примера, хранятся списки выбранных полей, по которым мы потом будем группировать.

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

 

 

Как это делается? На слайде я привел алгоритм кода.

  • У нас на входе есть настройки: по каким выбранным полям СКД нужно выполнить свертку. Мы берем СКД и программно добавляем в нее один элемент – группировку, которую набираем из выбранных полей в настройках, но уже формируем полноценную программную группировку.

  • Затем внутри группировки мы добавляем еще один параметр: независимо от типа группировки (по собственникам, клиентам и т.д.), нам нужно разбивать вагоны на пустые или груженые. Поэтому дополнительно добавляется еще один признак: пустой или груженый вагон.

  • В детальные записи добавляется сам вагон и результат мы выводим в коллекцию дерево значений.

  • А затем мы начинаем обходить группировки – формируем имя группы, и записываем это все в соответствие. Ключом будет вагон, а значением – идентификатор (наименование) группировки, куда входит вагон.

  • Во время программного вывода вагонов, в случае, если включен режим группировки, мы группируем подряд по совпадению имени группы – если предыдущая группировка вагона такая же, мы его добавляем в группу. Вот так мы накапливаем такие группы и дальше.

 

 

Здесь у нас внизу есть цикл, в котором мы будем обходить эти вагоны.

Но сначала мы создаем соответствие «ГруппыСворачиванияВагонов» и переходим в функцию, которая получает соответствие.

Функция ПолучитьСоответствиеГруппСворачиванияВагонов()

    СхемаКомпоновкиДанных = ПолучитьИзВременногоХранилища(АдресСКДОтбораВагонов);
    Настройки = Построитель.ПолучитьНастройки();

    // Перенос выбранных полей в группировку СКД
    Настройки.Структура.Очистить();

    ГруппировкаСКД = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    ГруппировкаСКД.Имя = РежимСворачиванияВагонов.Наименование;
    ГруппировкаСКД.Использование = Истина;
    НастройкиСворачивания = РежимСворачиванияВагонов.ПользовательскиеНастройки.Получить();

    Для каждого Элемент Из НастройкиСворачивания.Выбор.Элементы Цикл

        Если Элемент.Использование Тогда
            ПолеГруппировки = ГруппировкаСКД.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
            ПолеГруппировки.Использование = Истина;
            ПолеГруппировки.Поле = Элемент.Поле;
            ПолеГруппировки.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
            ПолеГруппировки.ТипДополнения = ТипДополненияПериодаКомпоновкиДанных.БезДополнения;
            ВыбранноеПоле = ГруппировкаСКД.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
            ВыбранноеПоле.Поле = Элемент.Поле;
        КонецЕсли;

    КонецЦикла;

    ПолеГруппировки = ГруппировкаСКД.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
    ПолеГруппировки.Использование = Истина;
    ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Порожний");
    ПолеГруппировки.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
    ПолеГруппировки.ТипДополнения = ТипДополненияПериодаКомпоновкиДанных.БезДополнения;

    ВыбранноеПоле = ГруппировкаСКД.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ВыбранноеПоле.Поле = ПолеГруппировки.Поле;

    ДетальныеЗаписи = ГруппировкаСКД.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
    ДетальныеЗаписи.Имя = "Детальные";
    ДетальныеЗаписи.Использование = Истина;

    ВыбранноеПоле = ДетальныеЗаписи.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
    ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Вагон");

    ВыбранныеВагоныВСКД = Настройки.ПараметрыДанных.Элементы.Найти("МассивВыделяемыхВагонов");
    ВыбранныеВагоныВСКД.Использование = Истина;
    ВыбранныеВагоныВСКД.Значение = ПолучитьМассивВагоновПунктаДетализации();

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

    ДеревоГруппВагонов = Новый ДеревоЗначений;
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    ПроцессорВывода.УстановитьОбъект(ДеревоГруппВагонов);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);

    СоответствиеГруппСворачиванияВагонов = Новый Соответствие;

    Для каждого ТекСтрокаГруппа Из ДеревоГруппВагонов.Строки Цикл

        СтруктураПолей = Новый Структура;
        НаименованиеГруппы = "";
        Для каждого Колонка Из ДеревоГруппВагонов.Колонки Цикл

            Если Колонка.Имя <> "Порожний" Тогда
                Если ТекСтрокаГруппа[Колонка.Имя] = Неопределено Тогда
                    Продолжить;
                Иначе

                    ЗначениеПоля = ТекСтрокаГруппа[Колонка.Имя];
                    ЧастьСтроки = ?(Колонка.ТипЗначения.СодержитТип(Тип("Булево")), Колонка.Имя, ЗначениеПоля);
                    НаименованиеГруппы = НаименованиеГруппы + ?(ПустаяСтрока(НаименованиеГруппы), "", "; ") + ЧастьСтроки;

                КонецЕсли;
            КонецЕсли;
            СтруктураПолей.Вставить(Колонка.Имя, ТекСтрокаГруппа[Колонка.Имя]);

        КонецЦикла;
        СтруктураПолей.Вставить("НаименованиеГруппы", НаименованиеГруппы);

        Для каждого ТекСтрока Из ТекСтрокаГруппа.Строки Цикл
            СоответствиеГруппСворачиванияВагонов.Вставить(ТекСтрока.Вагон, СтруктураПолей);
        КонецЦикла;

    КонецЦикла;

    Возврат СоответствиеГруппСворачиванияВагонов;

КонецФункции

Здесь происходит работа с СКД:

  • мы получаем схему из временного хранилища и создаем в ней сборную группировку СКД;

  • получаем настройки сворачивания из справочника «ВариантыГруппировкиВагонов» и начинаем обходить их выбранные поля. Можно было использовать свойство «ПоляГруппировки» настроек, но мы решили, что через поля «Выбор» будет проще. Мы обходим поля выбора и добавляем их программно в сборную группировку;

  • после этого искусственно добавляем еще один элемент группировки – «Порожний» (пустой вагон);

  • и добавляем детальные записи, где будет наш вагон.

 

 

  • отбираем только те вагоны, которые выведены на текущей зоне отображения.

  • формируем дерево групп вагонов – выводим результат компоновки данных в дерево,

  • и, как я и говорил, обходим дерево с формированием соответствия вагонов группам:

    • из названий колонок дерева мы формируем наименования для каждой группы;

    • вставляем в структуру полей наименование группы;

    • и формируем для вагона соответствие – в какую группу он входит.

 

 

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

 

Сегментирование данных

 

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

 

 

С такими задачами мы сталкивались чаще всего. Один из примеров – черные списки.

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

Условия отбора могут быть разными: мы можем заблокировать поставщика или может быть заблокирован конкретный водитель или перевозчик.

Здесь мы также решили использовать отборы СКД.

У нас есть «Рабочее место контрольно-пропускного пункта». Если вбивается автомобиль, который нельзя пропускать, пользователю выводится пометка, что водитель в черном списке – его по такой-то причине нельзя пропускать.

 

 

Чтобы это реализовать, мы точно так же создали справочник «Условия черного списка», который хранит настройки СКД – в данном случае мы используем отбор.

Мы выводим на форму возможность редактировать отбор – период черного списка и его описание. А внутри отбора выбираются параметры, по которым машину нельзя пускать.

 

 

Работа с СКД здесь заключается в том, что мы создаем в СКД набор данных «Объект» – таблицу значений, в которую в качестве полей входят типы объектов, по которым мы потом будем отбирать. В данном случае эта таблица будет формироваться по данным документа «Товарно-транспортная накладная» (ТТН), поэтому мы забиваем сюда все поля, по которым пользователю нужно давать отбор.

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

 

 

Как и в следующих кейсах, везде применяется схожая технология.

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

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

  • мы для каждого варианта черного списка получаем схему компоновки;

  • в таблицу объекта-запроса схемы мы помещаем данные ТТН и передаем СКД на выполнение;

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

 

 

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

Бывало такое, что определенный грузополучатель писал письмо ЖД-оператору, что не справляется с получением груза, и просит вагоны от определенного поставщика с определенным грузом переадресовывать на другой причал (на другого контрагента).

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

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

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

 

Примечания к документам

 

И последний кейс на сегодня – это примечания к документам

 

 

Это другая конфигурация – «Управление стивидорной компанией», конфигурация для портового оператора. По сути, это складская логистика, но с портовой спецификой.

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

Например, по грузу «Заготовка» нужно печатать примечание «Вес заявлен отправителем», по другому грузу – нужно печатать размеры. Еще иногда по грузам нужно вбивать какие-то примечания вручную, но их нужно ограничивать по определенным условиям, чтобы можно было ввести только определенный текст.

Это опять же реализуется с помощью СКД.

Создается элемент справочника «Примечание к документу»:

  • выбирается вид документа – может использоваться определенный набор документов: ТТН на отгрузку, приемный акт на автомобиль или вагон и прочие документы;

  • указывается наименование;

  • указывается отбор для документа – например, конкретная номенклатура;

  • перечисляется, какие примечания могут автозаполняться;

  • и какие примечания нужно отобрать пользователю при условии выполнения отбора.

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

И потом в момент, когда пользователь выбирает на форме документа груз и нажимает кнопку «Заполнить примечания», у нас выполняется точно такой же запрос – мы обходим все примечания по данному отбору, получаем список примечаний и те, у которых стоит флажок автозаполнения – заполняются сразу, а те, у которых флажка нет, переносятся в список выбора данного поля.

 

Вопросы

 

Можно ли эти механизмы применить к какой-нибудь другой конфигурации, насколько это сложно?

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

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

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

Зачем использовать при инициализации схемы именно адрес временного хранилища, а не сразу вызывать схему?

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

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

Что у вас за конфигурации, что они реализуют?

У нас есть конфигурации «Арт:Зерновой терминал» и «Арт:Элеватор» – это складские системы для учета приемки, хранения и отгрузки зерновых культур. Там реализуется количественно-качественный учет зерна, который во всех странах постсоветского пространства практически одинаковый – там могут отличаться коды форм, но все равно они более-менее похожи.

То же самое – конфигурация «Арт:Маслоналивной терминал», она реализует учет масла.

Помимо этого, у нас большой процент разработок – это ЖД-решения. Те примеры, которые я сегодня показывал, были из систем «Арт:ЖД Терминал» и «Арт.ЖД Отгрузка». Это, как правило, большие проекты, когда на предприятии есть какой-то карьер, добывается очень много сырья и оно отгружается в порожние вагоны. В таких случаях необходима система по управлению вот этими вагонами.

Для этих конфигураций у нас много «фишек» реализовано на табличном документе – вагоны можно перетаскивать на другие пути, пункты, учитываются перегоны, работа локомотивов, увязка с датчиками GPS и с топливом. И потом выставляются услуги.

Что касается ЖД-перевозок, то наше флагманское решение – это «Арт:ЖД логистика», конфигурация, которая реализует обмен электронными накладными через систему «АС клиент УЗ», украинский аналог системы «Этран», которую использует РЖД для электронных ЖД-накладных. Мы можем из нашей системы создавать ЖД-накладные, учитывать заказы на перевозку. Она основана на УНФ – просчитывается рентабельность вагонного парка, заказов на перевозку и т.д.

Есть свое решение по автотранспорту со спецификой под тех клиентов, с которыми мы работаем.

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

 

*************

Данная статья написана по итогам доклада (видео), прочитанного на онлайн-митапе "Практика применения СКД". Больше статей можно прочитать здесь.

Специальные предложения

Оставьте свое сообщение

См. также

Как просто запомнить алгоритм программного вывода в СКД Промо

СКД v8 v8::СКД Бесплатно (free)

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

01.09.2017    55328    unichkin    19    

КУ! или Нарезка графика продолжается

СКД v8 v8::СКД Россия Бесплатно (free)

Продолжение публикации https://infostart.ru/public/1639182/. Как справиться с неудачным отображением концов графика. Проверено в версии 8.3.13.1644.

23.04.2022    434    AnatolPopov    0    

Нарезка графика ломтями

СКД v8::СКД Россия Бесплатно (free)

Как в СКД простыми средствами улучшить отображение графика, которому слишком тесно на шкале. Проверено в версии 8.3.13.1644.

09.04.2022    607    AnatolPopov    0    

Убираем параметры из отбора СКД

Универсальные функции СКД v8 v8::СКД Бесплатно (free)

Заметка о некоторых технических нюансах параметров данных и отборов СКД.

17.02.2022    2770    Yashazz    28    

Полезности применения СКД Промо

СКД v8::УФ v8::СКД УТ10 Россия Бесплатно (free)

Нюансы при работе из СКД на программном уровне.

11.04.2012    53173    logarifm    42    

Отладка СКД

СКД v8::СКД Бесплатно (free)

На митапе «Практика применения СКД» выступил ведущий разработчик 1С аутсорсинговой компании Programming Store Павел Шемякин. Павел рассказал, как бороться с нежелательной «оптимизацией» запроса СКД, какие инструменты для отладки СКД можно использовать – в чем их отличия и преимущества, и показал, как работать с консолью компоновки данных – на какие элементы структуры XML-файла макета СКД обращать внимание при поиске причин неправильной работы отчета.

08.02.2022    4822    ProfessionStore    2    

Программная работа и компоненты СКД

СКД v8::СКД Бесплатно (free)

На митапе «Практика применения СКД» выступил архитектор Digital Business Петр Базелюк. Он рассказал о том, как работать с СКД программно, и как, используя общедоступную библиотеку FoxyLink, создать свой процессор вывода результата СКД напрямую в формат JSON или в CSV.

04.02.2022    2838    pbazeliuk    3    

Реализация отборов на форме с помощью СКД

СКД v8 v8::СКД 1cv8.cf Бесплатно (free)

В статье описана практическая методика использования системы компоновки данных (СКД) для реализации отборов на любых формах конфигурации.

28.12.2021    4684    quazare    6    

СКД программно для обработки (не отчета) + программное восстановление значений полей из настроек для управляемых форм Промо

СКД v8::СКД 1cv8.cf Бесплатно (free)

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

29.01.2014    96280    anig99    26    

Как указать время в периоде типового отчета (СтандартныйПериод, СКД) в системах класса WMS, MES, SCADA, АСУ ТП на 1С, построить отчет за период с временем?

СКД v8 1cv8.cf Бесплатно (free)

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

13.12.2021    1194    SizovE    0    

Отбор/фильтр в отчетах/СКД/обработках 1C: БП, УТ, ERP, Кронос: WMS по файлу Excel, текстовому файлу или списку текстовых строк (номер документа, артикул, ИНН, QR-код, штрих-код, наименование)

СКД v8 v8::УФ 1cv8.cf Бесплатно (free)

Как построить отчет Анализ продаж или Остатки товаров с отбором/фильтром по списку кодов товаров/артикулов или ИНН покупателей из Эксель файла? Покажем, какой код нужно добавить в конфигурацию 1С (в том числе нетиповую), чтобы в любом отчете/отборе СКД/обработке можно было заполнять отбор по excel файлу, текстовому файлу или просто по списку строк - удобно и быстро.

23.11.2021    1243    SizovE    3    

Кейсы решения задач на СКД

СКД v8 v8::СКД Бесплатно (free)

Разработчик 1С в компании Neti Александр Крынецкий выступил на Infostart Meetup, посвященном практике работы с СКД. Александр поделился с коллегами кейсами по решению сложных задач при работе с СКД.

08.11.2021    4581    echo77    7    

СКД. Вставка разрыва страницы Промо

СКД v8::СКД 1cv8.cf Россия Бесплатно (free)

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

29.10.2011    57686    stoptime    58    

Грабли на СКД

СКД v8 v8::СКД Россия Бесплатно (free)

Наиболее частые проблемы, с которыми сталкиваются программисты 1С при разработке отчетов на СКД.

02.11.2021    6146    echo77    17    

СКД: 5 советов, как сделать лучше

СКД v8 v8::СКД 8.3.14 Бесплатно (free)

Несколько примеров решения задач с использованием разных подходов

27.10.2021    6997    Neti    19    

Программное создание отчета на СКД с расшифровкой (обычные формы)

СКД v8::СКД 1cv8.cf Бесплатно (free)

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

04.10.2021    1505    Neti    4    

Создаем отчет с заданной периодичностью на СКД Промо

СКД v8::СКД 1cv8.cf Россия Бесплатно (free)

Учимся создавать отчет с заданной периодичностью с использованием СКД.

16.04.2012    81724    Lyns_owner    38    

Программное открытие отчета СКД с параметрами и отбором

СКД v8 v8::УФ v8::СКД Бесплатно (free)

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

07.08.2021    11069    Eugen-S    20    

Объект "Схема запроса" и расширения языка запросов СКД

СКД v8 v8::Запросы Россия Бесплатно (free)

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

18.07.2021    2796    mysm    14    

СКД: скрываем нужные группы (блоки) по требованию пользователя

СКД v8::СКД 1cv8.cf Бесплатно (free)

Видимость блоков в определённой группе, регулируемая пользователем в отчёте СКД.

14.07.2021    4016    olja-ljaaa    7    

Изменение расшифровки макета СКД до компоновки

СКД v8 v8::СКД Бесплатно (free)

Это не про работу с данными расшифровки. Это про изменение расшифровок полей ДО того, как СКД выполнилась. Быстрый способ сделать нужные расшифровки.

12.07.2021    2779    Yashazz    6    

Чтоб в СКД по таблице значений был порядок!

СКД v8::СКД Бесплатно (free)

Сортировка СКД и источник - таблица значений. Заметка.

28.06.2021    1813    Yashazz    0    

Учебный пример программного формирования схемы компоновки данных: Универсальный отчет по регистрам накопления

СКД v8 Бесплатно (free)

Разберём учебную задачу создания Универсального отчета по оборотным регистрам накопления конфигурации.

14.06.2021    4070    maraton1185    4    

Формирование отчета СКД с расшифровкой из обработки

СКД v8 v8::СКД 1cv8.cf Бесплатно (free)

Формирование отчета СКД из обработки немного отличается от формирования из отчета.

27.04.2021    4827    John_d    14    

Нестандартное использование СКД

СКД v8::СКД Бесплатно (free)

Программист 1С в компании «БКС-технологии» Алексей Шиянов в ходе Infostart Meetup Novosibirsk продемонстрировал необычный способ использования СКД и сравнил результаты заполнения движений документа через СКД с классическим подходом к заполнению движений через запросы и циклы.

14.04.2021    4601    user1127305    11    

Полезные примеры СКД, ч.2

СКД v8 v8::СКД Бесплатно (free)

Еще несколько примеров решения задач в СКД.

06.04.2021    13597    Neti    8    

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

СКД v8 v8::СКД 1cv8.cf Бесплатно (free)

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

02.04.2021    1660    parshachello    2    

Полезные примеры СКД, ч.1

СКД v8::СКД Бесплатно (free)

Подборка видео по решению различных задач в отчетах на СКД.

30.03.2021    17269    Neti    21    

Отбор на форму (документа, справочника, обработки) с помощью СКД

СКД v8 v8::СКД 1cv8.cf Бесплатно (free)

Добавляем удобный отбор на форму документа с помощью СКД

09.02.2021    7300    John_d    15    

Перенос/копирование и установка отбора/фильтра/периода при интерактивном переключении или смене варианта отчета/СКД в БСП 3.1 (1C ERP, УТ, БП, ...)

СКД v8 1cv8.cf Бесплатно (free)

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

18.01.2021    2102    SizovE    4    

Установка нескольких фильтров/отбора СКД в табличной форме, хранение в табличной части для отправки push/email уведомлений (ОтборКомпоновкиДанных, КомпоновщикНастроек, ДинамическийСписок)

СКД v8 v8::УФ v8::СКД Бесплатно (free)

Рассмотрим, как организовать установку фильтров/отбора СКД (динамического списка) на push/email уведомления в подсистеме EDIbot (WebApp) для 1С в табличной части "События уведомлений".

02.11.2020    1808    SizovE    0    

Пользовательское поле СКД одной процедурой

СКД v8 Бесплатно (free)

Быстрое создание пользовательского поля "выражение" одной процедурой

05.08.2020    2535    Yashazz    0    

Роль "Остатки" поля набора данных СКД в отчете и в расшифровке

СКД v8::СКД 1cv8.cf Бесплатно (free)

В СКД создан набор данных "Запрос". Запрос выполняется к виртуальной таблице "Остатки и обороты", периодичность регистра "Авто", выбираются все измерения и ресурсы регистра, а так же выбирается Регистратор и ПериодСекунда. Для полей содержащих остатки устанавливается роль "Остатки". Для полей "Регистратор" и "ПериодСекунда" устанавливается роль "Период". Для поля "Регистратор" устанавливается выражение упорядочивания.

24.05.2020    8492    kasper076    18    

Макет оформления в отчете с несколькими СКД

СКД v8::СКД Россия Бесплатно (free)

Как заставить работать макет оформления в отчёте с несколькими СКД.

14.05.2020    5270    vendim    2    

СКД. Использование Менеджера временных таблиц в системе компоновки

СКД v8 v8::Запросы v8::СКД 1cv8.cf Бесплатно (free)

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

29.04.2020    14461    the1    48    

Ограничения полей, или как обмануть СКД?

СКД v8 v8::СКД 1cv8.cf Бесплатно (free)

Каждое из ограничений полей можно обойти. Рассмотрим варианты обхода и способы обезопасить свой отчет.

15.04.2020    19473    SeiOkami    41    

Работа с запросами в 1С СКД. Отладка СКД

СКД v8::Запросы v8::СКД Россия Бесплатно (free)

В предыдущем разделе мы изучали с вами особенности работы с запросами в СКД. Для изучения (отладки) работы различных схем компоновки данных я использовал консоль компоновки данных.

15.04.2020    5645    ProfessionStore    3    

Работа с запросами в 1С СКД. Особенности работы запросов в СКД. Часть 3

СКД v8::Запросы v8::СКД Россия Бесплатно (free)

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

13.04.2020    9896    ProfessionStore    4    

СКД: Прозрачная обработка результата

СКД v8::СКД 1cv8.cf Бесплатно (free)

В статье дан ответ на вопрос о том, как "прозрачно" обработать результат компоновки (да хотя бы картинки вставить после того, как отчет сформирован).

13.04.2020    6486    starik-2005    16    

Работа с запросами в 1С СКД. Особенности работы запросов в СКД. Часть 2

СКД v8::Запросы v8::СКД Россия Бесплатно (free)

Все примеры разобраны с помощью консолей компоновки данных, речь о которых пойдет в предпоследнем разделе статьи.

12.04.2020    8100    ProfessionStore    11    

Работа с запросами в 1С СКД. Особенности работы запросов в СКД. Часть 1

СКД v8::Запросы v8::СКД 1cv8.cf Россия Бесплатно (free)

Все примеры разобраны с помощью консолей компоновки данных, речь о которых пойдет в предпоследнем разделе статьи.

11.04.2020    13485    ProfessionStore    9    

Работа с запросами в 1С СКД. Язык выражений СКД и подмена запросов

СКД v8::Запросы v8::СКД Россия Бесплатно (free)

Хотя эта статья называется «Работа с запросами в 1С СКД», нельзя не упомянуть про язык выражений СКД. Да – у системы компоновки данных есть свой язык! Это не язык платформы 1С, это не язык запросов. Это еще один язык, который используется 1С в СКД для обработки полученного набора (ов) данных.

11.04.2020    12453    ProfessionStore    25    

Работа с запросами в 1С СКД. Примеры использования расширения языка запросов СКД

СКД v8::Запросы v8::СКД Россия Бесплатно (free)

Все тонкости использования расширения языка запросов 1С для СКД вы можете изучить по ссылкам, которые приведены в предыдущей статье. Здесь мы рассмотрим конкретные кейсы применения данного расширения.

10.04.2020    10753    ProfessionStore    5    

Запросы 1С СКД. Возможности и ограничения

СКД v8::Запросы v8::СКД Россия Бесплатно (free)

В этом цикле статей мы рассмотрим особенности работы системы компоновки данных с запросами в 1С.

10.04.2020    14187    ProfessionStore    14    

Вложенные СКД

СКД v8 v8::СКД Бесплатно (free)

Возможности, нюансы, заметки.

26.03.2020    11026    Yashazz    19