Снежинка для запроса

Публикация № 1456173 21.06.21

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

Схема запроса Запрос Текучий интерфейс

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

Оглавление

Введение. 1

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

Пакет запросов. Использование промежуточных результатов. 2

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

Агрегация. 3

Сборка результатов, левое соединение подготовленных результатов. 4

Этапы сборки. Измерения. 4

Условие вхождения. 6

Объединение результатов, использование однородных по структуре выборок в запросе с объединением  

Удаление лишнего

Вывод. 8


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

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

Предлагаю рассмотреть вариант использования "Схемы запроса" не как альтернативы работы с текстом, а как объект, на базе которого можно создать свой собственный вариант DSL по работе с запросами. На примере такой реализации в объекте "Модель запроса" рассмотрены варианты использования символа * для конструирования запросов в сравнении с работой с текстом запроса.

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

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

ВЫБРАТЬ * 
ПОМЕСТИТЬ ВременнаяТаблица 
ИЗ &ТабличнаяЧасть КАК Таблица

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

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

Вот так этот же запрос выглядит при использовании "Модели запроса":

Заказ = Документы._ДемоЗаказПокупателя.СоздатьДокумент();
МодельЗапроса = Общий.МодельЗапроса();
МодельЗапроса.ЗапросПакета().Поместить("ВТ_СЧЕТА_НА_ОПЛАТУ")
	.Выбрать()
		.Источник("&СчетаНаОплату", , Заказ.СчетаНаОплату)
		.Поле("*");

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

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

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

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

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

  • Последовательное уточнение и агрегация
  • Сборка результатов
  • Комбинация предыдущих двух

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

ВЫБРАТЬ
	_ДемоКонтрагенты.Ссылка КАК Контрагент,
	_ДемоДоговорыКонтрагентов.Ссылка КАК ДоговорКонтрагента,
	_ДемоЗаказПокупателя.Ссылка КАК Реализация
ИЗ
	Справочник._ДемоКонтрагенты КАК _ДемоКонтрагенты
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник._ДемоДоговорыКонтрагентов КАК _ДемоДоговорыКонтрагентов
		ПО _ДемоКонтрагенты.Ссылка = _ДемоДоговорыКонтрагентов.Владелец
			ЛЕВОЕ СОЕДИНЕНИЕ Документ._ДемоЗаказПокупателя КАК _ДемоЗаказПокупателя
			ПО _ДемоДоговорыКонтрагентов.Ссылка = _ДемоЗаказПокупателя.Договор
		ЛЕВОЕ СОЕДИНЕНИЕ Документ._ДемоЗаказПокупателя КАК _ДемоЗаказПокупателя
		ПО _ДемоКонтрагенты.Ссылка = _ДемоЗаказПокупателя.Контрагент

Если попытаться описать такую связь в конструкторе, то получим сообщение об ошибке 'Противоречивая связь "#2"'. Описать такое соединение одновременно с двумя источниками слева к одному справа в принципе можно, но похоже это будет на обходное решение. Такой запрос лучше декомпозировать и представить двумя последовательными запросами в одном пакете. В первом запросе получаем результат соединения таблиц контрагентов и договоров, а во втором уже полученный результат соединяем с таблицей заказов.

 
 Текст запроса: последовательность

Вот так будет выглядеть модель запроса:

МодельЗапроса = Общий.МодельЗапроса();
//  ЗАПРОС ПАКЕТА. ВТ_СТОРОНЫ_ДОГОВОРА
МодельЗапроса.ЗапросПакета().Поместить("ВТ_СТОРОНЫ_ДОГОВОРА")
	.Выбрать()
		.Источник("Справочник._ДемоКонтрагенты")
		.Источник("Справочник._ДемоДоговорыКонтрагентов")
		.ЛевоеСоединение("_ДемоКонтрагенты", "_ДемоДоговорыКонтрагентов").Связь("Ссылка = Владелец")
		.Поле("_ДемоКонтрагенты.Ссылка", "Контрагент")
		.Поле("_ДемоДоговорыКонтрагентов.Ссылка", "Договор");
//  ЗАПРОС ПАКЕТА.
МодельЗапроса.ЗапросПакета()
	.Выбрать()
		.Источник("ВТ_СТОРОНЫ_ДОГОВОРА")
		.Источник("Документ._ДемоЗаказПокупателя")
		.ЛевоеСоединение("ВТ_СТОРОНЫ_ДОГОВОРА", "_ДемоЗаказПокупателя").Связь("Контрагент, Договор")
		.Поле("ВТ_СТОРОНЫ_ДОГОВОРА.*")
		.Поле("_ДемоЗаказПокупателя.Ссылка", "Заказ");

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

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

МодельЗапроса = Общий.МодельЗапроса();
//  ЗАПРОС ПАКЕТА. ВТ_СТОРОНЫ_ДОГОВОРА
МодельЗапроса.ЗапросПакета().Поместить("ВТ_СТОРОНЫ_ДОГОВОРА")
	.Выбрать()
		.Источник("Справочник._ДемоКонтрагенты")
		.Источник("Справочник._ДемоДоговорыКонтрагентов")
		.ЛевоеСоединение("_ДемоКонтрагенты", "_ДемоДоговорыКонтрагентов").Связь("Ссылка = Владелец")
		.Поле("_ДемоКонтрагенты.Ссылка", "Контрагент")
		.Поле("_ДемоДоговорыКонтрагентов.Ссылка", "Договор");
//  ЗАПРОС ПАКЕТА. ВТ_ЗАКАЗЫ
МодельЗапроса.ЗапросПакета().Поместить("ВТ_ЗАКАЗЫ")
	.Выбрать()
		.Источник("ВТ_СТОРОНЫ_ДОГОВОРА")
		.Источник("Документ._ДемоЗаказПокупателя")
		.ЛевоеСоединение("ВТ_СТОРОНЫ_ДОГОВОРА", "_ДемоЗаказПокупателя").Связь("Контрагент, Договор")
		.Поле("ВТ_СТОРОНЫ_ДОГОВОРА.*")
		.Поле("_ДемоЗаказПокупателя.Ссылка", "Заказ");
//  ЗАПРОС ПАКЕТА.
МодельЗапроса.ЗапросПакета()
	.Выбрать()
		.Источник("ВТ_ЗАКАЗЫ")
		.Количество("Заказ")
		.Поле("*")

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

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

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

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

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

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

 
 Текст запроса: сборка

И модель:

МодельЗапроса = Общий.МодельЗапроса();
//  ЗАПРОС ПАКЕТА. ВТ_ИЗМЕРЕНИЯ
МодельЗапроса.ЗапросПакета().Поместить("ВТ_ИЗМЕРЕНИЯ");
	МодельЗапроса.Выбрать(, Истина)
		.Источник("Документ.ЗаказПокупателя")
		.Поле("ЗаказПокупателя.Организация")
		.Поле("ЗаказПокупателя.Контрагент");
//  ЗАПРОС ПАКЕТА. ВТ_ПРОДАЖИ
МодельЗапроса.ЗапросПакета().Поместить("ВТ_ПРОДАЖИ")
	.Выбрать()
		.Источник("РегистрНакопления.Продажи.Обороты", "ПродажиОбороты").УсловиеВхождения("ВТ_ИЗМЕРЕНИЯ")
		.Поле("ПродажиОбороты.Организация")
		.Поле("ПродажиОбороты.Контрагент")
		.Поле("ПродажиОбороты.СуммаОборот");
//  ЗАПРОС ПАКЕТА. ВТ_ДОЛГИ
МодельЗапроса.ЗапросПакета().Поместить("ВТ_ДОЛГИ")
	.Выбрать()
		.Источник("РегистрНакопления.РасчетыСПокупателями.Остатки", "РасчетыСПокупателямиОстатки").УсловиеВхождения("ВТ_ИЗМЕРЕНИЯ")
		.Поле("РасчетыСПокупателямиОстатки.Организация")
		.Поле("РасчетыСПокупателямиОстатки.Контрагент")
		.Поле("РасчетыСПокупателямиОстатки.СуммаОстаток", "Долг");
//  ЗАПРОС ПАКЕТА.
МодельЗапроса.ЗапросПакета()
	.Выбрать()
		.Источник("ВТ_ИЗМЕРЕНИЯ")
		.Источник("ВТ_ПРОДАЖИ")
		.Источник("ВТ_ДОЛГИ")
		.ЛевоеСоединение("ВТ_ИЗМЕРЕНИЯ", "ВТ_ПРОДАЖИ").Связь("Организация, Контрагент")
		.ЛевоеСоединение("ВТ_ИЗМЕРЕНИЯ", "ВТ_ДОЛГИ").Связь("Организация, Контрагент")
		.Поле("ВТ_ИЗМЕРЕНИЯ.*")
		.Поле("ВТ_ПРОДАЖИ.*")
		.Поле("ВТ_ДОЛГИ.*");

В модели обратите внимание, что сборка осуществляется по всем полям с использованием *. При добавлении полей через * в тексте запроса платформа для одинаковых псевдонимов полей сгенерирует дубли полей с псевдонимами с индексом, однако в модели такой прием позволяет оставлять первое поле с данным псевдонимом и пропускать все остальные с таким же псевдонимом. В "Модели запроса" работает также правило и для выражений полей: если поле уже есть, то при использовании * дубли добавлены не будут.

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

Обычно условие вхождения имеет вид:

(Организация, Контрагент) В
				(ВЫБРАТЬ
					ВТ_ИЗМЕРЕНИЯ.Организация,
					ВТ_ИЗМЕРЕНИЯ.Контрагент
				ИЗ
					ВТ_ИЗМЕРЕНИЯ КАК ВТ_ИЗМЕРЕНИЯ)

С использованием символа * это же условие могло бы выглядеть так:

(Организация, Контрагент) В
				(ВЫБРАТЬ
					*
				ИЗ
					ВТ_ИЗМЕРЕНИЯ КАК ВТ_ИЗМЕРЕНИЯ)

И при использовании Модели запроса, так:

УсловиеВхождения("ВТ_ИЗМЕРЕНИЯ")

Промежуточные возможные варианты:

  1. УсловиеВхождения("ВТ_ИЗМЕРЕНИЯ", “Организация = Организация, Контрагент = Контрагент”)
  2. УсловиеВхождения("ВТ_ИЗМЕРЕНИЯ", “Организация, Контрагент”)
  3. УсловиеВхождения("ВТ_ИЗМЕРЕНИЯ", “*”)

* аналогичное условие можно сделать и для соединения: СвязьВхождения(“ВТ_ИЗМЕРЕНИЯ”).

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

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

Объединение также подразумевает однородную структуру объединяемых данных. Это важное обстоятельство позволяет исходить из того, что ключевые поля будут одинаковые, а различия могут быть в ресурсных полях и в источнике. Тогда первый оператор выборки можно взять за образец и последующие получить копированием из первого. После копирования достаточно поменять источник и при необходимости ресурсные поля.

Еще одни вариант устранения избыточности - использовать в каждом объединении символ *. Однако такой вариант подходит только в случае полного совпадения структуры полей для выбираемых источников объединения.

 
 Текст запроса: объединение

И модель:

МодельЗапроса = Общий.МодельЗапроса();
//  ЗАПРОС ПАКЕТА. ВТ_РАБОТА_С_ПОКУПАТЕЛЯМИ
МодельЗапроса.ЗапросПакета().Поместить("ВТ_РАБОТА_С_ПОКУПАТЕЛЯМИ")
	.Выбрать()
		.Источник("РегистрНакопления._ДемоОборотыПоСчетамНаОплату.Обороты")
		.Поле("Номенклатура")
		.Поле("СуммаОборот")
		.Поле("0", "КоличествоОборот")
	.ОбъединитьВсе(,, 0)
		.ЗаменитьИсточник("Обороты", "РегистрНакопления._ДемоОстаткиТоваровВМестахХранения.Обороты")
		.Поле("0", "СуммаОборот")
		.Поле("КоличествоОборот", "КоличествоОборот");
//  ЗАПРОС ПАКЕТА. ВТ_РАБОТА_С_ПОКУПАТЕЛЯМИ
МодельЗапроса.ЗапросПакета()
	.Выбрать()
		.Источник("ВТ_РАБОТА_С_ПОКУПАТЕЛЯМИ")
		.Сумма("СуммаОборот")
		.Сумма("КоличествоОборот")
		.Поле("*");

Здесь использован оператор ОбъединитьВсе, где указан индекс оператора для копирования. Копирование существующего оператора позволяет быстро строить большие объединения по подобию.

Удаление лишнего

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

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

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

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

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

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

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. triviumfan 28 28.06.21 19:34 Сейчас в теме
Как же потом это сопровождать...
2. kalyaka 742 29.06.21 09:28 Сейчас в теме
(1) Если взлетит - силами сообщества, проект открыт🙂

Может сама идея кому-нибудь поможет найти решение в собственных задачах.
3. Areal 14 15.07.21 23:19 Сейчас в теме
Это, конечно, прикольно. Но! Код - он для человека, дабы его легко было понять, а тут программисту каждый раз нужно в голове компилировать это, помимо того, что нужно ещё и удерживать логику задачи в этой самой голове. Ну на фи г
4. kalyaka 742 16.07.21 08:43 Сейчас в теме
(3)
Код - он для человека, дабы его легко было понять, а тут программисту каждый раз нужно в голове компилировать это
Тут я исхожу из того, что программист знает структуру запросов, т.е. в общем случае нужно при описании запроса следовать структуре:
Запросы:
    {
        Операторы: 
            {
                Источники, 
                Соединения, 
                Поля, 
                Условия
            }
    },
    Порядок,
    Итоги
}
Показать

и тогда все становится однотипно и читать легче :). И идея в статье позволяет эту структуру описать в еще более компактном виде.
Даже разовые задачи по исправлению данных, когда требуется анализ, сведение, перераспределение и прочие манипуляция с данными - я вначале пытаюсь решить в консоли запроса. Однако по достижению некоторого предела сложности я перехожу уже в код и там начинаю использовать уже модель запроса.
Dmitryiv; TeMochkiN; +2 Ответить
5. kuntashov 420 21.07.21 01:05 Сейчас в теме
(1) Просто оставлю это здесь (потому что должно было быть в тексте статьи) :))))
Прикрепленные файлы:
Оставьте свое сообщение

См. также

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

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

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

12.12.2020    5154    Eugen-S    24    

Стек технологий для 1С

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

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

29.11.2021    11807    mrXoxot    73    

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

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

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

27.10.2021    5533    Neti    19    

saby v8unpack

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

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

09.10.2021    2030    Businka76    34    

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

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

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

27.01.2016    86664    Serginio    116    

Девопсы в 1С: микросервис распознавания штрихкодов

WEB Git (GitHub, GitLab, BitBucket) DevOps Практика программирования Бесплатно (free)

Распознавание штрихкода из сканированного документа в PDF.

09.08.2021    1694    alexey_kurdyukov    8    

Лямбда-функции на встроенном языке 1С

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

Анонимная функция средствами 1С. Пророчества грядущих функций первого класса и ООП. Другие смелые заявления.

28.06.2021    5290    AntonProgma    298    

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

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

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

06.04.2021    11756    Neti    8    

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

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

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

16.03.2021    7622    velemir    33    

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

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

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

30.03.2021    14782    Neti    21    

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

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

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

25.03.2021    46733    rayastar    53    

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

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

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

30.08.2020    21590    quazare    34    

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

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

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

28.12.2020    9371    comol    31    

«Варп-двигатель» для «среза последних»

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

Решение, позволяющее получить данные, аналогичные "срезу последних" на два порядка быстрее.

10.08.2020    4052    hobi    49    

Не спеша, эффективно и правильно – путь разработки. Часть 3. Практика

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

Черновой вариант книги Никиты Зайцева, a.k.a.WildHare. Разработкой на платформе 1С автор занимается с 1996-го года, специализация — большие и по-хорошему страшные системы. Квалификация “Эксперт”, несколько успешных проектов класса “сверхтяжелая”. Успешные проекты ЦКТП. Четыре года работал в самой “1С”, из них два с половиной архитектором и ведущим разработчиком облачной Технологии 1cFresh. Ну — и так далее. Не хвастовства ради, а понимания для. Текст написан не фантазером-теоретиком, а экспертом, у которого за плечами почти двадцать три года инженерной практики на больших проектах.

29.06.2020    13300    WildHare    33    

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

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

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

10.12.2016    41348    unichkin    74    

Не спеша, эффективно и правильно – путь разработки. Часть 2. Теория

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

Черновой вариант книги Никиты Зайцева, a.k.a.WildHare. Разработкой на платформе 1С автор занимается с 1996-го года, специализация — большие и по-хорошему страшные системы. Квалификация “Эксперт”, несколько успешных проектов класса “сверхтяжелая”. Успешные проекты ЦКТП. Четыре года работал в самой “1С”, из них два с половиной архитектором и ведущим разработчиком облачной Технологии 1cFresh. Ну — и так далее. Не хвастовства ради, а понимания для. Текст написан не фантазером-теоретиком, а экспертом, у которого за плечами почти двадцать три года инженерной практики на больших проектах.

22.06.2020    13578    WildHare    24    

Не спеша, эффективно и правильно – путь разработки. Часть 1. Парадигма

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

Черновой вариант книги Никиты Зайцева, a.k.a.WildHare. Разработкой на платформе 1С автор занимается с 1996-го года, специализация — большие и по-хорошему страшные системы. Квалификация “Эксперт”, несколько успешных проектов класса “сверхтяжелая”. Успешные проекты ЦКТП. Четыре года работал в самой “1С”, из них два с половиной архитектором и ведущим разработчиком облачной Технологии 1cFresh. Ну — и так далее. Не хвастовства ради, а понимания для. Текст написан не фантазером-теоретиком, а экспертом, у которого за плечами почти двадцать три года инженерной практики на больших проектах.

15.06.2020    20589    WildHare    35    

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

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

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

08.05.2020    88328    user5300    28    

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

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

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

15.10.2018    36610    tormozit    106    

JSON в запросах DaJet QL

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

Практические примеры работы с JSON непосредственно в языке запросов. Перенос курсов валют между УТ и БП. Требуется SQL Server 2016 и выше.

24.04.2020    4576    zhichkin    6    

Визионное программирование

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

Новый способ программирования и его практическая демонстрация.

22.04.2020    5508    mkalimulin    111    

Использование машинного обучения для решения инцидентов. Практическое применение

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

Продолжаю (и заканчиваю) тему с автоматическим решением инцидентов. Перейдем от теории к практике.

25.02.2020    5036    Repich    9    

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

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

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

20.09.2012    83180    tormozit    131    

Использование машинного обучения для решения инцидентов

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

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

18.02.2020    8226    Repich    17    

Основные алгоритмы снабжения на простом примере

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

Надо же что-то полезное иногда писать

13.02.2020    6127    1c-intelligence    36    

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

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

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

27.01.2020    70070    ids79    27    

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

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

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

11.07.2007    55096    tormozit    51    

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

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

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

15.01.2020    45757    John_d    22    

Часовой на страже логов

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

При поддержке решений, которые установлены у большого количества пользователей на различных системах, очень важно вовремя получать подробную информацию о возникших проблемах. О том, как собирать логи и анализировать полученные данные в трекере ошибок Sentry на конференции Infostart Event 2019 Inception рассказал Андрей Крапивин.

13.01.2020    10033    Scorpion4eg    8    

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

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

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

30.12.2019    37677    kuzyara    38    

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

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

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

10.09.2017    51856    tormozit    74    

Шпаргалка (БСП). Добавление в новый документ механизма печати дополнительных печатных форм

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

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

10.10.2019    32491    John_d    21    

Таблица значений. Нюансы

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

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    55344    Yashazz    56    

СКД. Отчеты с картинками

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

Решение популярных кейсов с картинками в отчетах на СКД.

25.09.2019    34469    YPermitin    58    

Развитие 1С программиста Промо

Мотивация, лидерство и личная эффективность Практика программирования Бесплатно (free)

Делюсь своим опытом и видением развития 1С программиста.

17.10.2018    29285    pashamak    64    

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

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

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

18.09.2019    22237    YPermitin    36    

Оповещения боту из 1С за 31 минуту

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

Поделюсь опытом, как быстро сделать бота с оповещениями в Телеграмм из 1С без лишних затрат.

18.09.2019    20511    feva    44    

[Шпаргалка] Программное создание элементов формы

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

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

06.09.2019    110607    rpgshnik    77    

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

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

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

25.04.2019    18163    m-rv    3    

Агрегатные функции СКД, о которых мало кто знает

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

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    81581    ids79    56    

Регистры бухгалтерии. Общая информация

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

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    48715    YPermitin    27    

Три костыля. Сказ про фокусы в коде

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

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

03.09.2019    30608    YPermitin    81    

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

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

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

16.04.2019    23584    m-rv    18    

Кодогенерация и метагенерация в 1С

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

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

26.08.2019    9723    kirovsbis    28    

Отслеживание выполнения фонового задания

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

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    46479    ids79    22    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

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

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    161418    ids79    77    

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

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

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

01.06.2018    37771    m-rv    23    

Фоновое выполнение кода в 1С - это просто

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

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

02.08.2019    63845    avalakh    27