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

Публикация № 1424279

Разработка - Практика программирования

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

 

 

О докладчике

 

 

Меня зовут Алексей Шиянов, я программист в компании «БКС-технологии».

  • По образованию я физик – в 2009 году закончил факультет физики Южного федерального университета. Тогда же я начал изучать программирование на C++. Немного программировал на Delphi и даже написал примитивный калькулятор.

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

  • В 2011 году начал работать программистом 1С.

  • В 2013 году передо мной встала задача, за которую никто не хотел браться: нужно было написать сложный многоуровневый отчет. Этот отчет из-за технических ограничений системы мог быть написан только на СКД – я решил, что расшибусь, но отчет этот напишу Так и вышло – я написал этот отчет за две или три недели. Сначала он был достаточно корявый и неуклюжий, но я его причесал, и он используется до сих пор. Это меня сподвигло на дальнейшее изучение возможностей СКД. Я изучил, что СКД может формировать не только табличные документы, но деревья и таблицы значений. С тех пор я использую СКД в нестандартных задачах. Все, что вы увидите в этой презентации, взято из моего опыта.

  • В 2018 году я переехал из Ростова-на-Дону в Новосибирск, в более прохладный климат.

  • А в 2020 году решил впервые поучаствовать в конференции Инфостарта.

Я работаю в компании БКС. Наша компания на рынке 25 лет, мы – брокер № 1 в России. У нас 5 тысяч сотрудников, из них 90 человек – сотрудники 1С. Мы сопровождаем и разрабатываем множество конфигураций 1С.

В докладе:

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

  • Выясним, с какими подводными камнями можно столкнуться на нашем пути.

  • Расширим кругозор, а некоторые, может быть, расширят и свое сознание.

 

На чем будем экспериментировать

 

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

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

Файл конфигурации вы можете скачать в приложении к статье.

 

СКД – не только для отчетов

 

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

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

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

 

Схема СКД

 

 

Как работает система компоновки данных:

  • В качестве входных параметров используются:

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

    • настройки – список полей, которые мы будем выводить, с отборами, сортировками, условным оформлением и так далее.

  • Из входных параметров формируется макет компоновки, который, обращаясь к базе, вынимает из нее данные и образует результат компоновки.

  • Результат компоновки – некий полуфабрикат, который может быть выведен:

    • либо в коллекцию значений;

    • либо в табличный документ.

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

 

 

Посмотрим, как это можно сделать программно.

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

  • Получаем из нее настройки по умолчанию.

  • Создаем объект «КомпоновщикМакетаКомпоновкиДанных».

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

  • Создаем объекты «ПроцессорКомпоновкиДанных» и «ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений».

  • Создаем таблицу значений, которая будет результирующей таблицей, в которой мы увидим наши данные.

  • Установим таблицу в процессор вывода и выведем в нее данные.

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

 

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

 

 

Итак, поехали.

 

 

Допустим, у нас есть документ «Реализация товаров и услуг».

 

 

Документ делает движения по трем регистрам накоплений:

  • РасчетыПоДоговорам,

  • ТоварыКОтгрузке,

  • ТоварыНаСкладах.

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

 

Наборы данных и их соединение

 

Чтобы сформировать движения с помощью схемы компоновки данных, мы создадим в нашей схеме компоновки данных два набора данных.

 

 

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

  • Некоторые данные, идущие до «НомерСтроки», представляют собой реквизиты табличной части.

  • «ПредварительныйЗаказ» и все, что ниже – реквизиты шапки документа.

У всех реквизитов мы прописываем типы, аналогичные тем типам, что даны у нас в документе.

На этом набор данных-объект мы сформировали.

 

 

Второй набор данных – запрос, он представляет собой запрос к таблице остатков регистра накопления «ТоварыНаСкладах».

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

Обратите внимание, что я здесь не указал дату среза, это поле я заполню позже. Это – маленькая военная хитрость, я к этому параметру вернусь позже.

 

 

Состыкуем два наших набора данных: это «Товары» – набор данных-объект и «ТоварыНаСкладах» – набор данных-запрос.

Их мы стыкуем по полям «Номенклатура» и «Склад».

Эти связи являются параметрическими – параметры я сделал одноименными для простоты.

Эти параметры являются списками значений. Почему? Особенность СКД в том, что если есть левое соединение двух наборов данных, оно может быть выполнено при определенных условиях столько раз, сколько встречается различных вариантов полей в первичном наборе данных. Если мы ставим «Номенклатуру» и «Склад» как параметры с типом «Список значений», то запрос выполнится только один раз, а в эти параметры будут переданы все возможные сочетания значений номенклатур и складов.

 

 

Вот как это выглядит – в исходной таблице «Товары» три строки, из них два варианта номенклатуры и два варианта склада.

Соответственно, в запрос второго набора данных будет передан следующий список параметров «Номенклатура» и «Склад».

 

 

По остаткам мониторов LG и Samsung на розничном и оптовом складах мы получим следующий результат запроса.

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

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

 

Вычисляемые поля

 

 

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

Мы добавим поле «Сумма», которое будет тождественно равно полю «СуммаСНДС» исходного набора данных «Товары».

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

 

Ресурсы и параметры

 

 

Поля «Количество» и «Сумма» добавим в ресурсы с применением агрегирующей функции Сумма().

 

 

Перейдем на закладку «Параметры»:

  • Добавим параметр «МоментВремени».

  • Остальные три параметра: «Период», «Номенклатура» и «Склад» у нас уже есть, но мы отключим для них использование и заполнение извне (поставим флажок «Ограничение доступности»).

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

 

 

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

Почему нельзя было делать это сразу? Дело в том, что схема компоновки данных умеет работать с нестандартными значениями типа Момент времени, Граница и так далее.

Но если мы сразу укажем здесь параметр «&Граница» или «&МоментВремени», они автоматически типизируются в дату, что приведет к неправильной работе алгоритма и багам.

А если мы сначала создадим параметр, а потом его передадим, «&МоментВремени» всегда будет передан как Момент времени, а «&Граница» как Граница. Эта схема проверена, поэтому я рекомендую такой способ обхода ограничений 1С.

 

Настройки

 

 

Дальше переходим на вкладку «Настройки», включаем использование параметра «Момент времени» и дальше будем думать, как нам группировать дерево значений.

 

 

У нас будет три группировки для регистров, так как у нас документ «Реализация» делает движения по трем регистрам накопления. Каждая группировка для регистра накопления будет названа точно так же, как этот регистр.

Конечно, группировки можно назвать как угодно: группировка 1, 2, 3 или по имени программиста, который разрабатывает, но это плохая практика, потому что сопровождать это будет тяжело. Поэтому каждую группировку я назвал одноименно с регистром.

 

 

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

 

 

В выбранные поля я включил авто-поле и поле ресурса «Количество».

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

 

 

У нас будет три группировки для регистров – они будут идти под номерами 1,2,3.

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

Краткое описание построения схемы компоновки данных завершено. Переходим к процедуре проведения.

 

Процедура проведения

 

 

Процедура проведения достаточно проста:

  • сначала мы очищаем все наши движения;

  • потом из макета получаем схему компоновки данных;

  • из схемы вытаскиваем настройки по умолчанию;

  • и передаем в настройки значение момента времени документа;

  • дальше создаем объект «КомпоновщикМакетаКомпоновкиДанных»;

  • получаем макет компоновки.

  • создаем процессор компоновки, инициализируем его.

 

 

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

  • «ПредварительныйЗаказ»;

  • «Контрагент»;

  • «Валюта»;

  • «Договор»;

  • «Период».

 

 

Дальше:

  • инициализируем процессор компоновки, передав ему в качестве параметра внешние наборы данных – под внешними наборами данных я подразумеваю структуру, в которую мы вложили таблицу значений;

  • создаем дерево значений;

  • создаем процессор вывода;

  • устанавливаем дерево значений в качестве результата процессора вывода;

  • и выводим.

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

 

 

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

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

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

Вот так это происходит.

 

Сравниваем «классику» и СКД

 

 

Все, конечно, красиво, но сразу возникает вопрос: если все так круто с СКД, почему еще используют «классику»?

 

 

У «классики» есть свои плюсы.

  • В ряде случаев она проще в сопровождении и разработке. Если проведение совершенно примитивное (добавляются только строки в регистр сведений напрямую из табличной части) в СКД вообще нет никакой потребности.

  • Есть случаи, которые СКД не может реализовать при всем желании, а в классике такие случаи можно реализовать.

Но у «классики» есть проблемы:

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

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

 

 

У СКД много других плюсов:

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

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

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

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

У СКД только два недостатка.

  • В СКД нельзя реализовать все, что можно реализовать в «классике».

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

 

Итог поединка

 

 

Итоги нашего поединка: СКД, по моему субъективному мнению, побеждает с перевесом в 1 балл.

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

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

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

 

Вопросы:

 

Зачем такие танцы с бубнами? Как и почему пришли к такой реализации? И в чем вообще преимущество реализации на СКД?

Я так понимаю, вопрос вызван простотой примера. Мне нужно было написать некую конфигурацию, которая не защищена авторским правом и свободна для распространения, поэтому я написал такой простой пример. Если у вас будет не одна табличная часть, а пять. Не три регистра, а, допустим, шесть. Из них половина – регистры сведений, а не только регистры накопления. Плюс регистры будут использовать частично одинаковые данные, частично – не одинаковые. Там это станет более понятным.

Вопрос по скорости проведения документов, которые так через СКД завернуты – выигрывает ли скорость относительно классики или проигрывает?

На малых объемах (100-150 строк в документе) примерно то же самое получается. Но если будет 15 тысяч строк, то СКД начинает уже выигрывать. СКД лучше масштабируется.

Как производить отладку и поиск ошибок в таких алгоритмах?

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

Какую самую интересную задачу с точки зрения разработки и бизнеса ты решал на СКД?

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

Приходилось ли когда-нибудь сделать откат в классику?

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

 

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

Данная статья написана по итогам доклада (видео), прочитанного на INFOSTART MEETUP Новосибирск. Больше статей можно прочитать здесь.

Приглашаем всех принять участие в INFOSTART EVENT 2021 (6-8 мая, СПб).

Скачать файлы

Наименование Файл Версия Размер
Нестандартное использование СКД: файл - пример конфигурации

.cf 120,71Kb
45
.cf 120,71Kb 45 Скачать бесплатно

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. SlavaKron 14.04.21 11:32 Сейчас в теме
сначала делался запрос, потом для результирующей таблицы значений добавлялось поле «Уникальный идентификатор», потом эта таблица сканировалась, и для каждого ссылочного поля этот уникальный идентификатор заполнялся. Фактически, получался запрос в цикле

1. Почему вы считаете, что получение уникального идентификатора делает запрос к ИБ?
2. Почему нельзя было использовать XMLСтрока(Ссылка) в "классике"?
SeiOkami; Shmell; triviumfan; Muxomop; dominatorwarr; +5 1 Ответить
9. SeiOkami 2092 09.05.21 09:17 Сейчас в теме
(1) кстати, по поводу этого примера. Действительно, необходимость перебирать таблицу для заполнения идентификатора в подобных задачах очень бесит.

Поэтому этот "ишуиз" к платформе самый "залайканый" )

https://github.com/SeiOkami/OneS/issues/5
2. user1466751 14.04.21 12:22 Сейчас в теме
Скринчик бы с замером производительности проведения классического и СКДшного, особенно % времени формирования макета.
cleaner_it; +1 Ответить
3. PrutskihKA 15.04.21 07:44 Сейчас в теме
Алексей, спасибо за статью и видео. Идея использование СКД инетересная. Если использовать в типовых решениях с использованием RLS и не возникала ошибок потерю полей при таком ограничении на СКД?
4. mixsture 15.04.21 10:58 Сейчас в теме
Кажется, просто минусов в СКД маловато вспомнили.
1) способность заменять левые соединения на внутренние при наличии отборов на поля соединяемой таблицы. И переспорить СКД невозможно в этом - только спускать соединение в код запроса.
2) когда в запросах есть группировки, а скд их вырезает с целью оптимизации. И за этим нужно следить.
3) в скд почти отсутствует отладка. Т.е. отладка сводится к: возьми запрос, который она сгенерила и отлаживай запрос. Т.е. средства отладки только для запроса нормальные.
4) каким образом у вас получилось исполнение на скд проведения быстрее запроса? Когда в основе скд все равно он же и будет выполнен. По-моему вы сравниваете кошмарно написанный запрос с скд.
wolfsoft; SeiOkami; cleaner_it; dabu-dabu; zaic; triviumfan; +6 Ответить
10. SeiOkami 2092 09.05.21 09:38 Сейчас в теме
(4)
+

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

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

В статье как-то упущена куча минусов, но приведены какие-то сомнительные плюсы типа возможности использовать Формат() и т.д. Так часто это нужно в проведении документа? И так уж сильно это выигрывает "классическую" постобработку? Скорее это опять же исключения из правил.

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

К минусам можно ещё много чего перечислить. Например, сравнение\объединение СКД в конфигураторе - это вообще жуткая боль. А если большая часть логики (и проверки и движения) заложена в СКД, то доработка такого комбайна превращается в ад. Можно использовать ЕДТ или сравнение гит или ещё какие-то сторонние средства, но зачем эта боль нужна вообще?)

Я за использование СКД в тех местах, где их не ожидают встретить. Но лишь тогда, когда это даёт реальное преимущество. И не приводит к боли и страданию. Привыкнуть можно ко всему, но если это действительно на пользу.
5. bulpi 184 15.04.21 14:06 Сейчас в теме
Не дай Бог когда-нибудь попасть на поддержку конфигурации, написанной таким умельцем. Я таких называю "горе от ума".
wolfsoft; SeiOkami; cleaner_it; ubnkfl; dabu-dabu; zaic; le_; Vitaly1C8; triviumfan; +9 Ответить
6. user925427 92 15.04.21 22:11 Сейчас в теме
(5) Грубовато, но согласен, что подобные оригинальные решения увеличивают стоимость поддержки. В рамках коллектива, где это родилось, используется на "ура", а в серию, вряд ли, пойдёт. Как с процессорами - наш Эльбрус, может, и оригинален, но мир заполнили Intel и AMD.
SeiOkami; ubnkfl; Vitaly1C8; triviumfan; Ali1976; +5 Ответить
7. Zhek 20.04.21 08:46 Сейчас в теме
В типовой конфигурации Бухгалтерия государственного учреждения 2.0 во всех документах используется СКД для формирования движений по регистру бухгалтерии. Удобно тем, что в пользовательском режиме можно настраивать проводки, добавлять свои и т.д.
С точки зрения производительности - спорное решение использовать СКД в транзакции проведения. Большую часть времени проведения любого документа (в среднем 80%) занимает формирование выполнение СКД. Даже для простого документа с парой строк в табличной части без контроля остатков.
Время проведения самых простых документов в районе 1 секунды. Для сравнения проведение самописных документов с обычным формированием движений без СКД занимает 0.1 - 0.2 с.
Так же следует помнить, что соединение наборов данных в СКД происходит перебором (аналог вложенных циклов SQL). Для наборов данных с большим количеством строк это проблема. Был пример, когда типовой отчет "зависал" на несколько часов из-за того, что использовалось соединение наборов данных. В очередном релизе от наборов данных отказались, сделав соединение в запроса средствами SQL. После этого отчет стал работать быстро.
Прикрепленные файлы:
cleaner_it; mondordom; +2 Ответить
8. SeiOkami 2092 09.05.21 09:09 Сейчас в теме
У СКД есть очень много "нестандартных" применений.
Однако, представленный является одним из самых "плохих" и скорее отталкивает)
Оставьте свое сообщение

См. также

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

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

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

27.01.2016    79419    Serginio    113    

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

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

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

27.04.2021    2138    John_d    14    

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

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

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

06.04.2021    4041    Neti    7    

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

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

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

02.04.2021    728    parshachello    2    

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

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

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

16.03.2021    3107    velemir    31    

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

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

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

30.03.2021    5974    Neti    18    

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

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

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

25.03.2021    16048    rayastar    47    

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

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

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

02.03.2021    313    lolipoka    4    

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

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

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

28.12.2020    5367    comol    31    

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

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

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

09.02.2021    4287    John_d    15    

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

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

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

02.11.2020    1135    SizovE    0    

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

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

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

20.10.2020    3228    antonivan    17    

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

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

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

10.12.2016    39045    unichkin    74    

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

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

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

30.08.2020    13225    quazare    34    

Вывод дерева в табличный документ СКД

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

Вывод содержимого элемента формы "ДанныеФормыДерево" в табличный документ средствами СКД.

09.07.2020    3494    Yashazz    7    

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

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

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

24.05.2020    4720    kasper076    17    

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

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

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

15.10.2018    32876    tormozit    105    

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

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

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

14.05.2020    3549    vendim    1    

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

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

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

08.05.2020    44981    user5300    17    

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

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

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

29.04.2020    8731    the1    38    

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

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

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

20.09.2012    79913    tormozit    131    

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

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

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

15.04.2020    11910    SeiOkami    39    

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

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

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

15.04.2020    4108    ProfessionStore    3    

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

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

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

13.04.2020    7205    ProfessionStore    4    

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

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

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

11.07.2007    50921    tormozit    49    

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

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

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

13.04.2020    4786    starik-2005    16    

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

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

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

12.04.2020    5754    ProfessionStore    11    

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

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

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

11.04.2020    8553    ProfessionStore    9    

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

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

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

10.09.2017    47840    tormozit    74    

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

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

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

11.04.2020    7746    ProfessionStore    25    

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

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

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

10.04.2020    7883    ProfessionStore    4    

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

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

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

10.04.2020    9740    ProfessionStore    14    

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

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

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

25.04.2019    16708    m-rv    3    

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

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

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

26.03.2020    7731    Yashazz    19    

СКД - одна из проблем связи Наборов данных

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

Официальная информация: 1. В схеме компоновки данных нет указания типа связи. Все связи считаются ЛЕВЫМИ внешними соединениями. 2. Если для вложенного набора данных указано условие фильтра, тогда связь вложенного набора данных с родительским набором данных считается ВНУТРЕННЕЙ. Или как получить все результаты основного набора при отборе в зависимом.

03.03.2020    6276    BelikovSA    10    

Получение значений всех полей в иерархии структуры отчета

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

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

28.02.2020    2368    real_MaxA    1    

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

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

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

16.04.2019    21331    m-rv    17    

Для чего нужен флаг "Автозаполнение" в СКД и каких проблем без него можно избежать

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

Речь пойдет о флаге «Автозаполнение» в наборе данных Запрос Системы компоновки данных (СКД). Сразу хочу отметить, что флаг «Автозаполнение» доступен только в наборе данных - Запрос.

26.02.2020    8248    Neti    41    

Программная работа с настройками СКД

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

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

27.01.2020    45303    ids79    26    

[СКД] Программное создание схемы компоновки данных

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

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

15.01.2020    33476    John_d    22    

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

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

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

01.06.2018    33298    m-rv    22    

Последовательности событий при проведении документа 1С. Шпаргалка + про формы + про расширения

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

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    25962    kuzyara    38    

30 задач. Странных и не очень

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

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    20024    YPermitin    61    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

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

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    10545    Sibars    19    

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

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

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

05.12.2017    29110    itriot11    34    

СКД. Лайфхак №2. Собираем отчет еще удобнее

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

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

20.11.2019    10919    aximo    18    

Простейший пример создания бизнес-процессов

Практика программирования Управление бизнес-процессами (BPM) v8::Бизнес-процессы 1cv8.cf Бесплатно (free)

Простой пример создания бизнес-процессов в несколько шагов. Может пригодиться при первом знакомстве с ними или для решении задач экзамена 1С:Специалист по платформе.

20.11.2019    24876    YPermitin    19    

Некоторые редко используемые возможности СКД

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

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

11.11.2019    12785    kser87    40    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С Промо

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

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    39131    ids79    40    

Лайфхак работы с СКД. Собираем отчет.

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

В этой статье я опишу небольшой "лайфхак" по сборке отчетов в СКД. Думаю, этот подход будет интересен тем, кто хочет быстро оформить отчет.

25.10.2019    27392    aximo    38    

Немного про СКД. Характеристики и проверка пустого отчета

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

Пример использования характеристик в СКД и программная работа с ними. А также описание проверки результата отчета на заполненность.

10.10.2019    13700    YPermitin    7