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

Публикация № 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 и с топливом. И потом выставляются услуги.

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

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

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

 

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

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

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

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

См. также

Аналог PIVOT в запросе 1С (как выполнить транспонирование таблицы в запросе 1С) Промо

Практика программирования v8 Бесплатно (free)

В статье показывается простой метод реализации аналога оператора PIVOT в запросе 1С без использования соединений.

12.12.2020    4694    Eugen-S    23    

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

Практика программирования v8 v8::СКД Бесплатно (free)

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

08.11.2021    2831    echo77    7    

Грабли на СКД

Практика программирования v8 v8::СКД Россия Бесплатно (free)

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

02.11.2021    3981    echo77    16    

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

Практика программирования v8 v8::СКД 8.3.14 Бесплатно (free)

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

27.10.2021    4735    Neti    19    

Использование классов .Net в 1С для новичков Промо

Разработка внешних компонент Универсальные функции Практика программирования v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    86027    Serginio    116    

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

Практика программирования v8::СКД 1cv8.cf Бесплатно (free)

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

04.10.2021    1118    Neti    4    

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

Практика программирования v8 v8::УФ v8::СКД Бесплатно (free)

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

07.08.2021    5697    Eugen-S    19    

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

Практика программирования v8::СКД 1cv8.cf Бесплатно (free)

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

14.07.2021    2795    olja-ljaaa    7    

Звуковое управление в 1С 8.3 Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

В данной статье описано создание библиотеки для звукового управления (выполнение команд голосом) для платформы 1С 8.3. Задача была поставлена так, чтобы модуль функционировал непосредственно на клиенте 1С, осуществляя управление формами, и взаимодействовал с интерфейсом.

16.03.2021    7327    velemir    33    

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

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

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

12.07.2021    2461    Yashazz    6    

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

Инструментарий разработчика Практика программирования v8::СКД Бесплатно (free)

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

28.06.2021    1399    Yashazz    0    

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

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

27.04.2021    4272    John_d    14    

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions Промо

Универсальные функции Практика программирования v8 Бесплатно (free)

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    9067    comol    31    

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

Практика программирования v8::СКД Бесплатно (free)

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

14.04.2021    4135    user1127305    11    

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

Практика программирования v8 v8::СКД Бесплатно (free)

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

06.04.2021    11046    Neti    8    

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

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

02.04.2021    1274    parshachello    2    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    41218    unichkin    74    

Неочевидные нюансы записи управляемой формы

Практика программирования v8 v8::УФ Платформа 1C v8.2 1cv8.cf Бесплатно (free)

Разберем несколько нюансов записи управляемой формы.

02.04.2021    13317    SeiOkami    54    

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

Практика программирования v8::СКД Бесплатно (free)

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

30.03.2021    13812    Neti    21    

Обзор полезных методов БСП 3.1.4

БСП (Библиотека стандартных подсистем) Практика программирования v8 1cv8.cf Бесплатно (free)

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

25.03.2021    42703    rayastar    51    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    36289    tormozit    106    

Сравнение данных с февралем високосного года (проблема 29 февраля)

Практика программирования v8::СКД Бесплатно (free)

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

02.03.2021    465    aleksei_adamov    4    

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

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

09.02.2021    6184    John_d    15    

Доработка проведения в ERP 2.5. (Регистры накопления, Регистры сведений)

Практика программирования v8 ERP2 БУ Бесплатно (free)

Покажу точки входа для доработки "типового" проведения документов в ERP для регистров оперативного учета. Рассмотрим три основные ситуации: нужно изменить имеющееся проведение документа; нужно сделать записи в существующие регистры; нужно с нуля описать алгоритм проведения в добавленный регистр. Пример реализован на 1С:ERP Управление предприятием 2 (2.5.4.120)

10.01.2021    11105    BuriyLesha    10    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

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

20.09.2012    82973    tormozit    131    

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

Работа с интерфейсом Практика программирования v8 v8::УФ v8::СКД Бесплатно (free)

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

02.11.2020    1520    SizovE    0    

Вычислить РАЗНОСТЬДАТ в рабочих днях

БСП (Библиотека стандартных подсистем) Практика программирования v8::Запросы v8::СКД ERP2 БП3.0 УТ11 ЗУП3.x Бесплатно (free)

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

20.10.2020    3911    antonivan    18    

Базовые вещи БСП, которые облегчат жизнь программисту 1С

БСП (Библиотека стандартных подсистем) Практика программирования v8 1cv8.cf Россия Бесплатно (free)

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

30.08.2020    20621    quazare    34    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

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

11.07.2007    54640    tormozit    51    

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

Практика программирования v8::СКД 1cv8.cf Бесплатно (free)

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

24.05.2020    6771    kasper076    17    

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

Практика программирования v8::СКД Россия Бесплатно (free)

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

14.05.2020    4428    vendim    2    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    51436    tormozit    74    

Форма выбора (подбор) в управляемых формах

Практика программирования v8 v8::УФ 1cv8.cf Россия Бесплатно (free)

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

08.05.2020    81484    user5300    24    

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

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

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

29.04.2020    12294    the1    48    

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

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

15.04.2020    16424    SeiOkami    41    

Выгрузка документа по условию Промо

Инструментарий разработчика Практика программирования v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    18086    m-rv    3    

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

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

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

15.04.2020    4923    ProfessionStore    3    

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

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

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

13.04.2020    8806    ProfessionStore    4    

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

Практика программирования v8::СКД 1cv8.cf Бесплатно (free)

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

13.04.2020    5720    starik-2005    16    

Как прикрутить ГУИД к регистру сведений Промо

Перенос данных из 1C8 в 1C8 Инструментарий разработчика Практика программирования v8 Бесплатно (free)

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

16.04.2019    23436    m-rv    18    

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

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

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

12.04.2020    7115    ProfessionStore    11    

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

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

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

11.04.2020    11604    ProfessionStore    9    

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

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

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

11.04.2020    10295    ProfessionStore    25    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    37231    m-rv    23    

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

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

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

10.04.2020    9814    ProfessionStore    4    

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

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

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

10.04.2020    12589    ProfessionStore    14    

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

Практика программирования v8 v8::СКД Бесплатно (free)

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

26.03.2020    9783    Yashazz    19    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

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

05.12.2017    30826    itriot11    34    

Конвертация расширения cfe в конфигурацию сf руками

Практика программирования v8 1cv8.cf Бесплатно (free)

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

18.03.2020    11020    wtlz    35