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

Публикация № 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 26 28.06.21 19:34 Сейчас в теме
Как же потом это сопровождать...
2. kalyaka 716 29.06.21 09:28 Сейчас в теме
(1) Если взлетит - силами сообщества, проект открыт🙂

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

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

См. также

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

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

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

27.01.2016    82615    Serginio    113    

Алгоритмы распределения сумм (наивная методика, Алгоритм Кэхэна)

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

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

08.07.2021    1333    con-men    28    

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

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

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

28.06.2021    3861    AntonProgma    294    

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

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

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

06.04.2021    7569    Neti    8    

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

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

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

16.03.2021    5248    velemir    31    

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

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

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

30.03.2021    9649    Neti    19    

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

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

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

25.03.2021    27585    rayastar    49    

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

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

Учебный курс по теории и практике программирования. Бесплатно. В виде структурированного текста. Статья 4. Эта статья посвящена причинам возникновения проблем с качеством кода и методикам их преодоления.

22.03.2021    1301    Артано    5    

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

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

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

28.12.2020    6990    comol    31    

Telegram бот на PHP

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

Сделаем простого Telegram бота на PHP.

01.03.2021    7411    John_d    10    

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

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

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

30.08.2020    16636    quazare    34    

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

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

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

10.08.2020    3678    hobi    49    

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

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

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

10.12.2016    39739    unichkin    74    

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

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

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

29.06.2020    12050    WildHare    33    

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

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

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

22.06.2020    12337    WildHare    23    

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

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

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

15.06.2020    18920    WildHare    34    

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

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

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

15.10.2018    34372    tormozit    106    

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

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

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

08.05.2020    58258    user5300    18    

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

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

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

24.04.2020    4317    zhichkin    6    

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

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

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

22.04.2020    5060    mkalimulin    111    

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

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

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

20.09.2012    81281    tormozit    131    

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

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

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

25.02.2020    4767    Repich    9    

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

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

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

18.02.2020    7733    Repich    17    

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

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

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

27.01.2020    54085    ids79    26    

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

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

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

11.07.2007    52425    tormozit    51    

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

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

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

15.01.2020    37954    John_d    22    

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

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

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

13.01.2020    8839    Scorpion4eg    8    

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

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

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

30.12.2019    30033    kuzyara    38    

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

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

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

10.09.2017    49050    tormozit    74    

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

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

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

07.10.2019    36878    HostHost    41    

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

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

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

01.10.2019    48036    Yashazz    55    

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

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

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

25.09.2019    29591    YPermitin    54    

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

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

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

17.10.2018    24824    pashamak    64    

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

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

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

18.09.2019    21119    YPermitin    36    

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

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

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

18.09.2019    19367    feva    43    

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

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

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

06.09.2019    86254    rpgshnik    71    

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

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

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

25.04.2019    17045    m-rv    3    

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

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

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

05.09.2019    69091    ids79    55    

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

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

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

05.09.2019    40748    YPermitin    25    

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

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

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

03.09.2019    28870    YPermitin    81    

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

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

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

16.04.2019    22092    m-rv    17    

Приватный блокчейн и 1С популярно

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

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

02.09.2019    6773    mkalimulin    140    

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

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

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

26.08.2019    9464    kirovsbis    28    

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

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

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

17.08.2019    41610    ids79    19    

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

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

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

01.06.2018    34866    m-rv    22    

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

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

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

08.08.2019    132429    ids79    75    

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

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

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

02.08.2019    53731    avalakh    26    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

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

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

26.07.2019    93473    ids79    15    

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

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

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

05.12.2017    29935    itriot11    34    

Как проводятся документы в типовых конфигурациях от 1С

Математика и алгоритмы Практика программирования Разработка v8::ОУ ERP2 УТ11 Россия УУ Бесплатно (free)

В свое время, когда только начинал шаги в 1С и изучал, как проводятся документы в конфигурациях на платформе 1С по книге "Разработка управляемого интерфейса" (Хрусталева Е.Ю.), и там были представлены примеры совсем далекие от того, как сейчас проводятся документы в современных конфигурациях от 1С.

24.07.2019    33856    skv_79    35    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

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

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    44498    ids79    27