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