18.04.2022 Александр Суворов 11006
Получение родителей определенных элементов сп...

Содержание:

1.       Простая рекурсивная функция

2.       Запрос в цикле  

   

1.      Простая рекурсивная функция


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


// Функция возвращает массив родителей элемента справочника, полученного на вход.

Функция ПолучитьМассивРодителейЭлемента(ЭлементСправочника)

                МассивРодителейЭлемента = Новый Массив;

                Пока ПустоеЗначение(ЭлементСправочника.Родитель) = 0 Цикл

                               МассивРодителейЭлемента.Добавить(ЭлементСправочника.Родитель);                      

                               ЭлементСправочника = ЭлементСправочника.Родитель;

                КонецЦикла

                Возврат МассивРодителейЭлемента;

КонецФункции

 

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

 

2.      Запрос в цикле


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


Функция ПолучитьМассивРодителейЭлемента (ЭлементСправочника)

                МассивРодителейЭлемента = Новый Массив;

                УровеньРодителя = ЭлементСправочника.Уровень();

                ТекстОбъединить = "";

                ТекстРодительЭлемента = "";

                ТекстЗапросаВТ = "";

                Для инд = 1 По УровеньРодителя Цикл

                               ТекстРодительЭлемента= ТекстРодительЭлемента+ ".Родитель";

                               Если инд<> 1 Тогда

                                               ТекстОбъединить= "

                                               |            

                                               |             ОБЪЕДИНИТЬ ВСЕ

                                               |";

                               КонецЕсли;

                               ТекстЗапросаВТ= ТекстЗапросаВТ+ ТекстОбъединить+ "

                               |ВЫБРАТЬ

                               |                             Склады" + ТекстРодительЭлемента+ " КАК Родитель

                               |              ИЗ

                               |                             Справочник.Склады КАК Склады

                               |              ГДЕ

                               |                             Склады.Ссылка = &ЭлементСправочника";

                КонецЦикла;

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

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

                |ВЫБРАТЬ

                |             ВТ_СписокРодителей.Родитель КАК Родитель

                |ИЗ

                |             (" + ТекстЗапросаВТ+ ") КАК ВТ_СписокРодителей";

                Запрос.УстановитьПараметр("ЭлементСправочника", ЭлементСправочника);

                ВыборкаЗапроса = Запрос.Выполнить().Выбрать();

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

                               МассивРодителейЭлемента.Добавить(Выборка.Родитель);

                КонецЦикла;

                Возврат МассивРодителейЭлемента;

КонецФункции


Если заранее известно точное значения уровня вложенности элемента справочника, то запрос можно составлять не динамически, а вручную, сразу указав нужное количество объединений таблиц.

 

Специалист компании «Кодерлайн»

Александр Суворов

Наши проекты

1с-РАРУС МСК
1с-РАРУС МСК

Отрасль:
Разработка компьютерного программного обеспечения

Внедренное типовое решение:
1С:Управление корпоративными финансами

- Финансово-бухгалтерский блок
- Казначейство ...

Автоматизация учета на базе ПП "1С:Комплексная автоматизация 8" в ЗАО "Крюгер-Гранд"
ЗАО «Крюгер-Гранд»

Отрасль:
Производство

Внедренное типовое решение:
1С:Комплексная автоматизация

- Создание интерфейсов и наборов прав пользователей;
- Отражению временных ...

ООО «ТейблТок»
ООО «ТейблТок»

Отрасль:
Общественное питание и рестораны

Внедренное типовое решение:
1С:Управление торговлей

Оформление заказов поставщикам Оформление заказов покупателей Управление ...

ООО “РТИТС”
ООО “РТИТС”

Отрасль:
Транспортные системы

Внедренное типовое решение:
1С:ERP Управление предприятием 2.0

Блок регламентированного кадрового учета и расчета заработной платы в 1С:ERP;...

ООО "РУКАРД-АУРА"
ООО "РУКАРД-АУРА"

Отрасль:
Профессиональные услуги

Внедренное типовое решение:
1С:Комплексная автоматизация

- Налоговый учет;...

ООО "АСТАРМЕДИКА КЛИНИКА МИКРОХИРУРГИИ ГЛАЗА"
ООО "АСТАРМЕДИКА КЛИНИКА МИКРОХИРУРГИИ ГЛАЗА"

Отрасль:
Деятельность больничных организаций

Внедренное типовое решение:
БИТ:Управление медицинским центром 8

- Управление отношениями с клиентами (CRM)
- Делопроизводство
- Ведение но...

ООО "Смена"
ООО "Смена"

Отрасль:
Торговля, склад, логистика, транспорт

Внедренное типовое решение:
1С:Комплексная автоматизация

Банк и касса
Расчеты с контрагентами
Торговые операции
Взаиморасчеты с...

Внедрение блока расчета себестоимости РАУЗ в 1С:УПП 8
ООО «Пелигрин Матен»

Отрасль:
Производство

Внедренное типовое решение:
1С:Управление производственным предприятием

– Оформление заказов покупателей;
– Взаиморасчеты с покупателями;
– О...

Внедрение 1С:Управление торговлей в оптово-розничной компании «Ална-Байк»
ИП Титов Виктор Сергеевич «Ална-Байк»

Отрасль:
Торговля

Внедренное типовое решение:
1С:Управление торговлей

- Управление складами;
- Управление заказами поставщиков;
- Управление зак...

ООО «Солви Пак»
ООО «Солви Пак»

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

Внедренное типовое решение:
1С:CRM+1С:Комплексная автоматизация

Управление отношениями с клиентами (CRM) ...

ФГОУ ВПО «Горский государственный аграрный университет»
ФГОУ ВПО «Горский государственный аграрный университет»

Отрасль:
Образование

Внедренное типовое решение:
1С:Колледж ПРОФ

- Управление персоналом и кадровый учет (HRM):
Кадровый учет
Управление об...

ООО "ЛИКАРД" (Лукойл)
ООО "ЛИКАРД" (Лукойл)

Отрасль:
Нефтесервис

Внедренное типовое решение:
1С:ERP Управление предприятием 2.0

Делопроизводство
• Учет и контроль исполнения поручений
Учет и хранение...

Наши соц. сети

Telegram-канал «Koderline 1С» Группа в Вконтакте «Кодерлайн КОРП» Rutube

Остались вопросы - обратитесь к нам!

Впишите свои Имя и Телефон, чтобы мы ответили на все интересующие Вас вопросы.
ФИО*
E-mail*
Телефон*
Сообщение