Модули общего назначения - готовые полезные функции и процедуры конфигураций на БСП

25.04.22

Разработка - Универсальные функции

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

 

Введение

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

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

Примеры будут приведены для типовой конфигурации БСП, сейчас это - версии 3.1.6.137 на Платформе 1с 8.3.20.1674.

 

Как обычно, я разобью статью на несколько частей:

1. Работа с данными - таблицы, структуры, массивы и соответствия.

2. Сохранение, чтение и удаление настроек из хранилища.

3. Оповещения пользователя.

 

Во всех частях я приведу примеры работы - таблицами, массивами, структурами, соответствиями, хранилищем, и типовым БСП оповещениями пользователя об ошибках.

Переходим к первой части статьи - работа с данными.

 

1.Работа с данными - таблицы, структуры, массивы и соответствия

В данном разделе, как указано в заголовке, привожу некоторые полезные примеры работы с таблицами, структурами, массивами и соответствиями. Перечисленные процедуры и функции находятся в модуле БСП - ОбщегоНазначенияКлиентСервер. Итак:

 

1.1. Процедура ДополнитьТаблицу(ТаблицаИсточник, ТаблицаПриемник) Экспорт

Процедура дополняет таблицу значений - приемник данными из таблицы значений - источника.

&НаКлиенте
Процедура ДополнитьТаблицуТаблицей(Команда)
	
	ВыполнитьНаСервере();
	
КонецПроцедуры

&НаСервере
Процедура ВыполнитьНаСервере()
	
	ТабДополнения = Новый ТаблицаЗначений();
	ТабДополнения.Колонки.Добавить("Дата");
	ТабДополнения.Колонки.Добавить("Номер");
	ТабДополнения.Колонки.Добавить("Сумма");
	
	НовСтрокаТабДоп = ТабДополнения.Добавить();
	НовСтрокаТабДоп.Дата = ТекущаяДата();
	НовСтрокаТабДоп.Номер = "11";
	НовСтрокаТабДоп.Сумма = 100;

	// из таблицы значений в табличную часть;	
	ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(ТабДополнения, Объект.НовТаб);
	
КонецПроцедуры	

 

1.2. Процедура ДополнитьТаблицуИзМассива(Таблица, Массив, ИмяПоля) Экспорт

Данная процедура дополняет таблицу значений Таблица значениями из массива.

&НаКлиенте
Процедура ДополнитьТаблицуИзМассива(Команда)
	
	Массив1 = Новый Массив();
	Массив1.Добавить(ТекущаяДата());
	
	ОбщегоНазначенияКлиентСервер.ДополнитьТаблицуИзМассива(Объект.НовТаб,Массив1,"Дата");

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

 

1.3. Процедура ДополнитьМассив(МассивПриемник, МассивИсточник, ТолькоУникальныеЗначения = Ложь) Экспорт

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

&НаКлиенте
Процедура ДополнитьМассивМассивом(Команда)
	
	Массив1 = Новый Массив();
	Массив1.Добавить("Красный");
	Массив1.Добавить("Зеленый");
	
	Массив2 = Новый Массив();
	Массив2.Добавить("Красный");
	Массив2.Добавить("Желтый");
	Массив2.Добавить("Синий");
	
	ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Массив1, Массив2, Истина); 

    Сообщить(Массив1.Количество());    // 4 - выборка только уникальных значений
	
КонецПроцедуры

 

1.4. Процедура ДополнитьСтруктуру(Приемник, Источник, Заменять = Неопределено) Экспорт

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

&НаКлиенте
Процедура ДополнитьСтруктуру(Команда)
	
	Структ1 = Новый Структура("Дата, Номер, Сумма");
	Структ1.Дата = ТекущаяДата();
	Структ1.Номер = "22";
	Структ1.Сумма = 0;

	Структ2 = Новый Структура("Сумма");	
	Структ2.Сумма = 10;	
	
    ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(Структ1,Структ2,Истина); // меняем значение из другой структуры

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

 

1.5. Процедура ДополнитьСоответствие(Приемник, Источник, Заменять = Неопределено) Экспорт

Данная процедура дополняет соответствие значениями из другого соответствия.

&НаКлиенте
Процедура ДополнитьСоответствие(Команда)
	
    НовСоотв1 = Новый Соответствие();
    НовСоотв1.Вставить("Цвет","Красный");
    НовСоотв1.Вставить("Название","Яблоко");
	
    НовСоотв2 = Новый Соответствие();
    НовСоотв2.Вставить("Цвет","Зеленый");
	
    ОбщегоНазначенияКлиентСервер.ДополнитьСоответствие(НовСоотв1,НовСоотв2,Истина); // заменит цвет
	
	//НовСоотв1.Получить("Цвет") // зеленый

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

 

1.6. Процедура УдалитьВсеВхожденияЗначенияИзМассива(Массив, Значение) Экспорт

Процедура удаляет все вхождения переданного значения из массива.

// здесь находим все индексы по значению и удаляем элементы по индексам 

Процедура УдалитьВсеВхожденияЗначенияИзМассива(Массив, Значение) Экспорт
	
	КоличествоЭлементовКоллекции = Массив.Количество();
	Для ОбратныйИндекс = 1 По КоличествоЭлементовКоллекции Цикл
		
		Индекс = КоличествоЭлементовКоллекции - ОбратныйИндекс;
		Если Массив[Индекс] = Значение Тогда
			Массив.Удалить(Индекс);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

 

1.7. Процедура УдалитьВсеВхожденияТипаИзМассива(Массив, Тип) Экспорт

Данная процедура удаляет все вхождения значений указанного типа.

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

Процедура УдалитьВсеВхожденияТипаИзМассива(Массив, Тип) Экспорт
	
	КоличествоЭлементовКоллекции = Массив.Количество();
	Для ОбратныйИндекс = 1 По КоличествоЭлементовКоллекции Цикл
		Индекс = КоличествоЭлементовКоллекции - ОбратныйИндекс;
		Если ТипЗнч(Массив[Индекс]) = Тип Тогда
			Массив.Удалить(Индекс);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

 

1.8. Процедура УдалитьЗначениеИзМассива(Массив, Значение) Экспорт

Процедура удаляет одно значение из массива.

// здесь ищем индекс по значению, удаляем элемент по индексу

Процедура УдалитьЗначениеИзМассива(Массив, Значение) Экспорт
	
	Индекс = Массив.Найти(Значение);
	Если Индекс <> Неопределено Тогда
		Массив.Удалить(Индекс);
	КонецЕсли;
	
КонецПроцедуры

 

1.9. Функция СвернутьМассив(Знач Массив) Экспорт

Функция возвращает копию исходного массива с уникальными значениями.

Функция СвернутьМассив(Знач Массив) Экспорт
	Результат = Новый Массив;
	ДополнитьМассив(Результат, Массив, Истина);
	Возврат Результат;
КонецФункции

 

1.10. Функция РазностьМассивов(Знач Массив, Знач МассивВычитания) Экспорт

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

&НаКлиенте
Процедура ДополнитьМассивМассивом(Команда)
	
	Массив1 = Новый Массив();
	Массив1.Добавить("Красный");
	Массив1.Добавить("Зеленый");
	
	Массив2 = Новый Массив();
	Массив2.Добавить("Красный");
	Массив2.Добавить("Желтый");
	Массив2.Добавить("Синий");
	
	А = ОбщегоНазначенияКлиентСервер.РазностьМассивов(Массив2, Массив1);

    Сообщить(А.Количество());    // 2 - "Желтый,Синий"
	
КонецПроцедуры

 

1.11. Функция СпискиЗначенийИдентичны(Список1, Список2) Экспорт

Функция сравнивает элементы списков значений или массивов по значениям.

// Возвращает истину или ложь

Функция СпискиЗначенийИдентичны(Список1, Список2) Экспорт
	
	СпискиИдентичны = Истина;
	
	Для Каждого ЭлементСписка1 Из Список1 Цикл
		Если НайтиВСписке(Список2, ЭлементСписка1) = Неопределено Тогда
			СпискиИдентичны = Ложь;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Если СпискиИдентичны Тогда
		Для Каждого ЭлементСписка2 Из Список2 Цикл
			Если НайтиВСписке(Список1, ЭлементСписка2) = Неопределено Тогда
				СпискиИдентичны = Ложь;
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	Возврат СпискиИдентичны;
	
КонецФункции

 

1.12. Функция ЗначениеВМассиве(Значение) Экспорт

Данная функция создает массив и помещает в него переданное значение.

Функция ЗначениеВМассиве(Значение) Экспорт
	
	Массив = Новый Массив;
	Массив.Добавить(Значение);
	
	Возврат Массив;
	
КонецФункции

 

1.13. Функция КлючиСтруктурыВСтроку(Структура, Разделитель = ",") Экспорт

Результат работы функции - строка, содержащая ключи структуры, разделенные символом разделителя.

&НаКлиенте
Процедура ДополнитьСтруктуру(Команда)
	
	Структ1 = Новый Структура("Дата, Номер, Сумма");
	Структ1.Дата = ТекущаяДата();
	Структ1.Номер = "22";
	Структ1.Сумма = 0;
	
    КлючиСтруктуры = ОбщегоНазначенияКлиентСервер.КлючиСтруктурыВСтроку(Структ1,",");
	
	Сообщить(КлючиСтруктуры);  // Дата, Номер, Сумма

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

 

1.14. Функция СвойствоСтруктуры(Структура, Ключ, ЗначениеПоУмолчанию = Неопределено) Экспорт

Функция возвращает значение свойства структуры.

&НаКлиенте
Процедура ДополнитьСтруктуру(Команда)
	
	Структ1 = Новый Структура("Дата, Номер, Сумма");
	Структ1.Дата = ТекущаяДата();
	Структ1.Номер = "22";
	Структ1.Сумма = 0;
	
    СвойствоСтруктуры = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Структ1,"Дата",);
	
	Сообщить(СвойствоСтруктуры);  // Дата

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

 

1.15. Функция ПустойУникальныйИдентификатор() Экспорт

Функция возвращает пустой уникальный идентификатор.

Функция ПустойУникальныйИдентификатор() Экспорт
	
	Возврат Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000");
	
КонецФункции

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

 

2. Сохранение, чтение и удаление настроек из хранилища.

Перечисленные процедуры и функции находятся в модуле БСП - ОбщегоНазначенияВызовСервера. Отмечу, что в данном разделе, я рассмотрю несколько примеров, касаемых данных форм.

 

2.1. Процедура ХранилищеНастроекДанныхФормСохранить(КлючОбъекта, КлючНастроек, Настройки, ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено, ОбновитьПовторноИспользуемыеЗначения = Ложь) Экспорт

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

&НаКлиенте
Процедура ЗапистьВХранилище(Команда)
	
	СохранимНастройкиФормыВХранилище();
	
КонецПроцедуры

&НаСервере
Процедура СохранимНастройкиФормыВХранилище()
	
	КлючОбъекта = ЭтаФорма.УникальныйИдентификатор;
	КлючНастроек = "Мои настройки формы";
	
	Настройки = Новый Структура();
	Настройки.Вставить("НовТаб", Объект.НовТаб.Выгрузить());
	
	ОбщегоНазначенияВызовСервера.ХранилищеНастроекДанныхФормСохранить(КлючОбъекта, КлючНастроек, Настройки,,,Истина);
	
КонецПроцедуры

 

2.2. Функция ХранилищеНастроекДанныхФормЗагрузить(КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию = Неопределено, ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) Экспорт

Загружает настройку из хранилища настроек данных форм, как метод платформы Загрузить.

&НаКлиенте
Процедура ПрочитатьХранилище(Команда)

	ВосстановитьНастройкиНаСервере();

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

&НаСервере
Процедура ВосстановитьНастройкиНаСервере()
	
	КлючОбъекта = ЭтаФорма.УникальныйИдентификатор;
	КлючНастроек = "Мои настройки формы";
		
	НастройкиВХранилище = ОбщегоНазначенияВызовСервера.ХранилищеНастроекДанныхФормЗагрузить(КлючОбъекта, КлючНастроек,,,);
    
	ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(НастройкиВХранилище.НовТаб,Объект.НовТаб);
	
КонецПроцедуры

 

2.3. Процедура ХранилищеНастроекДанныхФормУдалить(КлючОбъекта, КлючНастроек, ИмяПользователя) Экспорт

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

&НаКлиенте
Процедура ОчиститьЗаписьВХранилище(Команда)
	
	ОчиститьНастройкиНаСервере();

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

&НаСервере
Процедура ОчиститьНастройкиНаСервере()
	
	КлючОбъекта = ЭтаФорма.УникальныйИдентификатор;
	КлючНастроек = "Мои настройки формы";
		
	ОбщегоНазначенияВызовСервера.ХранилищеНастроекДанныхФормУдалить(КлючОбъекта, КлючНастроек,);
	
КонецПроцедуры

Далее, переходим к третьей части статьи - оповещение пользователя.

 

3. Оповещения пользователя.

Перечисленные процедуры и функции находятся в модуле БСП - ОбщегоНазначенияКлиентСервер.

 

3.1. Процедура ДобавитьОшибкуПользователю(Ошибки,ПолеОшибки, ТекстДляОднойОшибки, ГруппаОшибок = Неопределено,НомерСтроки = 0,ТекстДляНесколькихОшибок = "",ИндексСтроки = Неопределено) Экспорт

Процедура добавляет в список ошибок новую ошибку пользователя для дальнейшей отправки с помощью процедуры СообщитьОшибкиПользователю()

&НаКлиенте
Процедура СообщитьОбОшибке(Команда)

    // подготавливаем структуру ошибок, далее отправим ее в "Сообщить ошибки пользователю"
	
	Ошибки = Новый Структура;
	Ошибки.Вставить("СписокОшибок", Новый Массив);
	Ошибки.Вставить("ГруппыОшибок", Новый Соответствие);
	
	ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки,"Банки[%1].Банк","Банк не определен 1",,5,"Банк в строке %5 не установлен 1",0);
	ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки,"Банки[%1].Банк","Банк не определен 2",,6,"Банк в строке %5 не установлен 2",0);
	ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки,"Банки[%1].Банк","Банк не определен 3",,7,"Банк в строке %5 не установлен 3",0);
	
КонецПроцедуры

 

3.2. Процедура СообщитьОшибкиПользователю(Ошибки, Отказ = Ложь) Экспорт

Процедура выводит накопленные методом ДобавитьОшибкуПользователю ошибки.

&НаКлиенте
Процедура СообщитьОбОшибке(Команда)
	
	Ошибки = Новый Структура;
	Ошибки.Вставить("СписокОшибок", Новый Массив);
	Ошибки.Вставить("ГруппыОшибок", Новый Соответствие);
	
	ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки,"Банки[%1].Банк","Банк не определен 1",,5,"Банк в строке %5 не установлен 1",0);
	ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки,"Банки[%1].Банк","Банк не определен 2",,6,"Банк в строке %5 не установлен 2",0);
	ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки,"Банки[%1].Банк","Банк не определен 3",,7,"Банк в строке %5 не установлен 3",0);
	
	
	ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(Ошибки,Ложь);
	
КонецПроцедуры

 

3.3. Функция ТекстОшибкиЗаполнения(ВидПоля = "Поле", ВидСообщения = "Заполнение", ИмяПоля = "", НомерСтроки = "", ИмяСписка = "", ТекстСообщения = "") Экспорт

Возвращает текст ошибки заполнения полей и списков.

&НаКлиенте
Процедура СообщитьОбОшибке(Команда)
	
	А = ОбщегоНазначенияКлиентСервер.ТекстОшибкиЗаполнения("Поле","Корректность","Банк",4,"","");
	Сообщить(А);
	
КонецПроцедуры

 

3.4. Функция ПутьКТабличнойЧасти(Знач ИмяТабличнойЧасти, Знач НомерСтроки, Знач ИмяРеквизита) Экспорт

Функция формирует путь к заданной строке НомерСтроки и колонке ИмяРеквизита.

Функция ПутьКТабличнойЧасти(
		Знач ИмяТабличнойЧасти,
		Знач НомерСтроки, 
		Знач ИмяРеквизита) Экспорт
	
	Возврат ИмяТабличнойЧасти + "[" + Формат(НомерСтроки - 1, "ЧН=0; ЧГ=0") + "]." + ИмяРеквизита;
	
КонецФункции

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

 

Заключение и выводы

Целью данной статьи, как я написал выше, - является создание небольшой "шпаргалки" для работы с классическими объектами в рамках возможностей библиотеки стандартных подсистем. Естественно, статья не претендует на новшества - их и нет тут, но под рукой ее будет держать полезно - просто быстро посмотрел, вспомнил, скопировал - сразу получил практический результат. Будет полезна всем.

 

Примеры данной статьи можете скачать на моем гит-хабе https://github.com/quazareline/general-function-modules

 

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

 

Мои предыдущие интересные материалы по использованию функционала БСП

 

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

Базовые приемы работы с кластером 1С при помощи БСП

Генерация штрихкодов с помощью БСП для программистов

Типовые методы конфигурации "Зарплата и управление персоналом", которые пригодятся каждому ЗУП программисту и не только

Печать макета MS Word в любом документе с помощью БСП

 

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

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

См. также

БСП. Добавляем отчет в меню Отчеты

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Добавим новый отчет в меню нового документа средствами БСП.

02.04.2024    3294    John_d    10    

90

Шаблоны новых объектов 1С для 1С:Бухгалтерии предприятия

Инструментарий разработчика БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 1С:Бухгалтерия 3.0 Бесплатно (free)

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

28.12.2023    5051    mrXoxot    11    

101

Переоткрытие внешних обработок

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

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

30.11.2023    4162    ke.92@mail.ru    16    

62

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    9602    YA_418728146    6    

143

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2300    28    progmaster    8    

3

Многопоточное выполнение процедуры с помощью ДлительныеОперации

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

26.02.2023    8917    egoriy111    28    

91