Первый шаг в 1С — абсолютно бесплатно.

📋 Динамичесий список в 1С 8.3

1. Что такое Динамический список и зачем он нужен?

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

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

 

Динамический список используется для создания:

* Списков справочников, документов, бизнес-процессов;

* Журналов документов;

* Произвольных отчетов и реестров прямо на формах.

2. Источники данных Динамического списка

Динамический список может работать в двух основных режимах:

* Основная таблица: Данные берутся напрямую из одной таблицы базы данных (например, Справочник.Номенклатура). В этом режиме платформа автоматически поддерживает стандартные команды (создание, копирование, изменение, пометка на удаление, проведение) и быстрый поиск.

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

Важно: При использовании произвольного запроса для сохранения системных команд (создать, изменить и т. д.) необходимо явно указать свойство «Основная таблица» в настройках динамического списка.

3. Архитектура и особенности работы: Сервер и Клиент

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

* На сервере: Динамический список выполняет запрос к СУБД, формирует выборку данных, применяет настройки группировок, отборов и сортировок. Объект ДинамическийСписок существует в контексте формы на сервере.

* На клиенте: На клиентскую часть передается лишь малая часть данных, необходимая для отображения текущей страницы/видимой области таблицы. На клиенте элементы таблицы списка представлены типом ТаблицаФормы.

Попытка обратиться к данным конкретной строки «напрямую» на клиенте приведет к тому, что вы получите доступ только к текущей выделенной строке

Элементы.Список.ТекущиеДанные

, но не сможете обойти все записи списка циклом.

4. Программная работа с Динамическим списком

Ниже приведены практические примеры настройки и управления динамическим списком на языке 1С 8.3.

Пример 1. Установка произвольного запроса на сервере Задача: Изменить текст запроса динамического списка при открытии формы или по нажатию кнопки, добавив левое соединение с остатками.

&НаСервере

Процедура НастроитьЗапросСпискаНаСервере()

// Обращаемся к реквизиту формы типа "ДинамическийСписок" (например, Список)

ТекстЗапроса =

ВЫБРАТЬ

|Номенклатура.Ссылка КАК Ссылка,

|Номенклатура.Код КАК Код,

|Номенклатура.Наименование КАК Наименование,

|ЕСТЬНУЛЛ(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК Остаток

|ИЗ

|Справочник.Номенклатура КАК Номенклатура

|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки

|ПО ТоварыНаСкладахОстатки.Номенклатура = Номенклатура.Ссылка";

// Присваиваем новый текст запроса

Список.ТекстЗапроса = ТекстЗапроса;

// Устанавливаем значение параметра запроса

Список.Параметры.УстановитьЗначениеПараметра("Период", ТекущаяДата());

КонецПроцедуры

Пример 2. Программный отбор на сервере

Задача: Установить отбор в динамическом списке по конкретному контрагенту и отключить его при необходимости.

&НаСервере

Процедура УстановитьОтборПоКонтрагентуНаСервере(СсылкаКонтрагент)

// Поиск существующего элемента отбора по левому значению

ПолеОтбора = Новый КомпоновкаДанныхПоле("Контрагент");

ЭлементОтбора = Неопределено;

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

Если Элемент.ЛевоеЗначение = ПолеОтбора Тогда

ЭлементОтбора = Элемент;

Прервать;

КонецЕсли;

КонецЦикла;

// Если элемент не найден — создаем новый

Если ЭлементОтбора = Неопределено Тогда

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

ЭлементОтбора.ЛевоеЗначение = ПолеОтбора;

КонецЕсли;

// Настройка параметров отбора

Если ЗначениеЗаполнено(СсылкаКонтрагент) Тогда

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = СсылкаКонтрагент;

ЭлементОтбора.Использование = Истина;

Иначе

ЭлементОтбора.Использование = Ложь; // Отключаем отбор

КонецЕсли;

КонецПроцедуры

Пример 3. Работа с выделенной строкой на клиенте

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

&НаКлиенте

Процедура ОбработатьВыбраннуюСтроку(Команда)

// Получаем элемент формы, отображающий динамический список

ЭлементТаблица = Элементы.Список;

// Читаем текущие данные выделенной строки

ТекущиеДанные = ЭлементТаблица.ТекущиеДанные;

Если ТекущиеДанные = Неопределено Тогда

Предупреждение("Пожалуйста, выберите строку в списке!");

Возврат;

КонецЕсли;

// Доступ к полям строки осуществляется по именам колонок

СсылкаНаДокумент = ТекущиеДанные.Ссылка;

Сообщить("Выбран документ: " + Строка(СсылкаНаДокумент));

КонецПроцедуры

 

Пример 4. Обновление списка на клиенте

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

&НаКлиенте

Процедура ОбновитьСписокНаКлиенте()

// Вызов обновления динамического списка через элемент формы

Элементы.Список.Обновить();

КонецПроцедуры

 

5. Оформление списка на форме (Условное оформление)

Описание Условное оформление позволяет подсвечивать строки или отдельные ячейки динамического списка (изменять цвет фона, шрифт, текст, видимость) в зависимости от значений полей.

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

&НаСервере

Процедура НастроитьУсловноеОформлениеНаСервере()

// Очищаем текущие настройки оформления

Список.УсловноеОформление.Элементы.Очистить();

// Создаем новый элемент условного оформления

ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();

// 1. Устанавливаем оформление (красный цвет текста)

ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);

// 2. Устанавливаем условие (Проведен = Ложь)

ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементУсловия.ЛевоеЗначение = Новый КомпоновкаДанныхПоле("Проведен");

ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементУсловия.ПравоеЗначение = Ложь;

ЭлементУсловия.Использование = Истина;

КонецПроцедуры

 

6. Частые ошибки и рекомендации по оптимизации

* Обход динамического списка циклом:

Ошибка: Попытка прочитать все строки динамического списка в цикле.

Решение: Динамический список — это инструмент интерфейса, а не обработки данных. Если вам нужно обойти записи, выполняйте самостоятельный запрос (Запрос = Новый Запрос) к базе данных на сервере.

* Использование тяжелых запросов в источниках:

Избегайте сложных подзапросов, неограниченных соединений с виртуальными таблицами без параметров и использования функции ВЫРАЗИТЬ без необходимости. Слишком сложный запрос приведет к задержкам при прокрутке списка пользователем.

* Отсутствие индексов:

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

Динамический спискок и Система компоновки данных (СКД)

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

1. Создание пользовательских команд для таблицы динамического списка

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

Пример Задача: Добавить команду «Быстро провести», которая меняет статус выделенного документа и проводит его прямо из списка.

Шаг 1. Клиентский обработчик команды

&НаКлиенте

Процедура БыстроПровести(Команда)

// Получаем выделенную строку

ТекущиеДанные = Элементы.Список.ТекущиеДанные;

Если ТекущиеДанные = Неопределено Тогда

Предупреждение("Выберите документ в списке!");

Возврат;

КонецЕсли;

// Вызываем серверную процедуру проведение

БыстроПровестиНаСервере(ТекущиеДанные.Ссылка);

// Обновляем список, чтобы отобразить изменения

Элементы.Список.Обновить();

КонецПроцедуры

 

Шаг 2. Серверная процедура выполнения действия

&НаСервере

Процедура БыстроПровестиНаСервере(СсылкаНаДокумент)

Попытка

// Получаем объект для изменения

ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();

// Выполняем проведение

ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);

Сообщить("Документ " + Строка(СсылкаНаДокумент) + " успешно проведен.");

Исключение

ВызватьИсключение "Ошибка при проведении: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());

КонецПопытки;

КонецПроцедуры

 

Размещение на форме:

В редакторе формы перетащите созданную команду в ветку

Элементы -> Список -> Командная панель или в

Элементы -> Список -> Контекстное меню.

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

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

В открываемой форме передаваемые данные принимаются в событии ПриСозданииНаСервере через глобальный параметр Параметры.

 

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

Код в форме списка (Отправитель)

&НаКлиенте

Процедура СоздатьЗаказДляКонтрагента(Команда)

ТекущиеДанные = Элементы.Список.ТекущиеДанные;

Если ТекущиеДанные = Неопределено Тогда

Предупреждение("Выберите контрагента из списка!");

Возврат;

КонецЕсли;

// Формируем структуру параметров

ПараметрыОткрытия = Новый Структура;

ПараметрыОткрытия.Вставить("ЗначенияЗаполнения", Новый Структура("Контрагент", ТекущиеДанные.Ссылка));

// Открываем форму объекта

ОткрытьФорму("Документ.ЗаказПокупателя.ФормаОбъекта", ПараметрыОткрытия);

КонецПроцедуры

 

Код в форме документа «Заказ покупателя» (Получатель)

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

// Платформа автоматически обрабатывает параметр "ЗначенияЗаполнения"

// для новых объектов, но при необходимости значение можно перехватить вручную:

Если Параметры.Свойство("ЗначенияЗаполнения") И ЗначениеЗаполнено(Объект.Ссылка) = Ложь Тогда

Значения = Параметры.ЗначенияЗаполнения;

Если Значения.Свойство("Контрагент") Тогда

Объект.Контрагент = Значения.Контрагент;

КонецЕсли;

КонецЕсли;

КонецПроцедуры

3. Множественный выбор и обработка нескольких элементов

Описание Если у элемента формы «Таблица» включено свойство Режим выделения = Множественный, пользователь может выделять несколько строк с помощью клавиш Shift или Ctrl.

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

Пример Задача: Пометить на удаление сразу несколько выбранных элементов справочника.

&НаКлиенте

Процедура ПометитьВыделенныеНаУдаление(Команда)

// Получаем массив выделенных строк

ВыделенныеСтроки = Элементы.Список.ВыделенныеСтроки;

Если ВыделенныеСтроки.Количество() = 0 Тогда

Предупреждение("Не выделено ни одной строки!");

Возврат;

КонецЕсли;

// Передаем массив ссылок на сервер для обработки

ОбработатьВыделенныеНаСервере(ВыделенныеСтроки);

// Обновляем список

Элементы.Список.Обновить();

КонецПроцедуры

&НаСервере

Процедура ОбработатьВыделенныеНаСервере(МассивСсылок)

Для Каждого СсылкаЭлемента Из МассивСсылок Цикл

Попытка

Объект = СсылкаЭлемента.ПолучитьОбъект();

// Устанавливаем инверсивную пометку на удаление

Объект.УстановитьПометкуУдаления(НЕ Объект.ПометкаУдаления);

Исключение

Сообщить("Не удалось обработать элемент: " + Строка(СсылкаЭлемента));

КонецПопытки;

КонецЦикла;

КонецПроцедуры

📋 План видов характеристик в 1С 8.3

Определение

План видов характеристик — это прикладной объект метаданных, предназначенный для описания видов характеристик . Вид характеристики — это, по сути, дополнительный реквизит, который пользователь может указать для любого объекта базы данных и задать его значение. Например, «Цвет» — «Синий» или «Размер» — «Большой» .

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

По своему устройству план видов характеристик очень похож на справочник: он поддерживает работу пользователей с видами характеристик («элементами») и списками, может поддерживать иерархию, может включать реквизиты и табличные части, возможно использование предопределённых видов характеристик .

Однако самой важной отличительной особенностью является свойство «Тип значения». Оно позволяет определить список возможных типов данных, используемых для отдельных видов характеристик . То есть для вида характеристики «Цвет» можно определить тип значения СправочникСсылка.Цвета, для «Год выпуска» — Дата, для «Вес» — Число и так далее.

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

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

Состав и свойства плана видов характеристик

Имя — идентификатор для обращения из кода. Например: СвойстваНоменклатуры, ВидыХарактеристик.

Тип значения характеристик — ключевое свойство. Определяет составной тип данных, куда входят все типы, которые могут понадобиться при указании типа значения характеристики . В этот составной тип могут входить как примитивные типы (Число, Строка, Дата, Булево), так и ссылочные типы (СправочникСсылка.<имя>, ДокументСсылка.<имя>, ПланВидовХарактеристикСсылка.<имя> и так далее) .

Дополнительные значения характеристик — свойство, указывающее на справочник, в котором могут храниться значения для тех видов характеристик, для которых в конфигурации нет подходящих объектов . Если пользователю станет недостаточно типов данных, существующих в системе, он сможет воспользоваться вспомогательным справочником, который разработчик создаёт заблаговременно .

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

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

Предопределённые виды характеристик — разработчик может задать некоторые виды характеристик на этапе конфигурирования. Такие виды характеристик имеют признак Предопределенный и не могут быть удалены пользователем .

Связь с другими объектами: хранение значений

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

Типовая логическая структура объектов для реализации механизма характеристик выглядит так :

План видов характеристик — хранит виды характеристик, которыми в принципе можно описывать объекты. Например: «Цвет», «Вес», «Габариты».

Справочник дополнительных значений — подчинён плану видов характеристик. Хранит конкретные значения для тех характеристик, для которых нет подходящего объекта в конфигурации. Например: «Красный», «Синий» для вида «Цвет»; «Большой», «Малый» для вида «Размер».

Регистр сведений — хранит соответствие между объектом, видом характеристики и конкретным значением. Измерения регистра обычно включают сам объект (например, номенклатуру) и вид характеристики. Ресурс регистра хранит значение.

В свойстве «Тип значения характеристик» плана видов характеристик указывается составной тип, включающий также ссылку на справочник дополнительных значений . В ресурсе регистра сведений используется тип Характеристика.<ИмяПланаВидовХарактеристик> — это составной тип данных, как он задан в типе значения соответствующего плана .

Дополнительно настраивается Связь по типу: измерение регистра «Вид характеристики» связывается с ресурсом «Значение». Это обеспечивает соответствие типа значений, вводимых в поле, и типа характеристики, выбранной в поле «Вид характеристики» .

Программная работа с планом видов характеристик

Обращение к видам характеристик

План видов характеристик по структуре таблицы очень похож на справочник. В запросах доступны поля: Ссылка, Код, Наименование, Родитель, ЭтоГруппа, Предопределенный, ТипЗначения и другие . Поле ТипЗначения имеет тип ОписаниеТипов и содержит тип значения характеристик данного вида .

Пример запроса: получение списка видов характеристик с их типами:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ВидыХарактеристик.Ссылка,

| ВидыХарактеристик.Наименование,

| ВидыХарактеристик.ТипЗначения

|ИЗ

| ПланВидовХарактеристик.СвойстваНоменклатуры КАК ВидыХарактеристик

|ГДЕ

| НЕ ВидыХарактеристик.ПометкаУдаления";

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

Сообщить("Характеристика: " + Выборка.Наименование);

КонецЦикла;

Программное создание вида характеристики

// Создание нового вида характеристики

НовыйВид = ПланыВидовХарактеристик.СвойстваНоменклатуры.СоздатьЭлемент();

НовыйВид.Наименование = "Область применения";

НовыйВид.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.ОбластиПрименения");

НовыйВид.Записать();

Работа с характеристиками на форме

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

Пример вывода характеристик на форму через реквизит формы:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

// Получаем набор записей регистра из реквизита формы

РСХарактеристики = РеквизитФормыВЗначение("Характеристики");

// Устанавливаем отбор по текущему элементу справочника

РСХарактеристики.Отбор.Объект.Установить(Объект.Ссылка, Истина);

// Читаем данные

РСХарактеристики.Прочитать();

// Возвращаем в реквизит формы

ЗначениеВРеквизитФормы(РСХарактеристики, "Характеристики");

КонецПроцедуры

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

Использование в отчётах через СКД: в схеме компоновки данных на закладке «Характеристики» описываются таблицы данных для получения характеристик. Указывается источник видов характеристик (план видов характеристик, поле ключа — Ссылка, поле имени — Наименование, поле типа значения — ТипЗначения) и источник значений характеристик (регистр сведений, поле объекта, поле вида, поле значения) . После этого характеристики можно выводить в отчёт, устанавливать по ним отбор и условное оформление .

Клиент vs Сервер: особенности работы

Планы видов характеристик доступны как на сервере, так и на клиенте, но создание, запись и чтение данных выполняются на сервере. На клиенте можно только вызывать серверные процедуры и функции.

Создание вида характеристики на сервере:

&НаСервере

Процедура СоздатьВидХарактеристикиНаСервере(Наименование, ТипЗначения)

НовыйВид = ПланыВидовХарактеристик.СвойстваНоменклатуры.СоздатьЭлемент();

НовыйВид.Наименование = Наименование;

НовыйВид.ТипЗначения = ТипЗначения;

НовыйВид.Записать();

КонецПроцедуры

Вызов с клиента:

&НаКлиенте

Процедура СоздатьХарактеристику()

Тип = Новый ОписаниеТипов("Число");

СоздатьВидХарактеристикиНаСервере("Вес", Тип);

КонецПроцедуры

 

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

Итоговая сводка

План видов характеристик — объект метаданных для описания видов характеристик, которыми могут описываться объекты базы данных. Хранит названия видов характеристик и их типы.

Ключевое свойство: «Тип значения характеристик» — составной тип данных, определяющий, значения какого типа могут принимать отдельные виды характеристик.

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

Хранение значений — сами значения хранятся в регистре сведений. Тип ресурса регистра задаётся как Характеристика.<ИмяПлана>. Настраивается «Связь по типу» между измерением «Вид характеристики» и ресурсом «Значение».

 

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

 

Основные области применения: хранение дополнительных свойств номенклатуры, контрагентов, документов; механизм субконто в бухгалтерском учёте .