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

21.09.20

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

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

1. Просмотр временной таблицы

Запрос.МенеджерВременныхТаблиц.Таблицы.Получить(0).ПолучитьДанные().Выгрузить();

2. Установка видимости реквизита по умолчанию

    РеквизитыПозиции = ДанныеДолжности();

    Если РеквизитыПозиции <> Неопределено Тогда

Объект.Учащийся = ?(РеквизитыПозиции.Учащийся = Неопределено, Ложь, РеквизитыПозиции.Учащийся);

        ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(

               Элементы,

               "ОбразованиеКвалификация",

               "Видимость",

               Объект.Учащийся);

    КонецЕсли;

3. Уничтожение временной таблицы

3.1

ЗарплатаКадры.УничтожитьВТ(

        МенеджерВременныхТаблиц,

        СтрРазделить("ВТФизическиеЛицаПатент,ВТКадровыеДанныеСотрудников,ВТИностранцыСотрудники,ВТИностранцы,ВТНерезиденты,ВТФиксированныеСтатусыФизическихЛиц,ВТТекущиеСтатусыФизическихЛиц,ВТИностранцыСДатами,ВТНачисления,ВТРегистрация,ВТРассчитанныеДниВРФ",","));

3.2

УдалитьВТ = Новый Массив;

УдалитьВТ.Добавить("втВременныеПозиции");

УдалитьВТ.Добавить("втВременныеПодразделения");

УдалитьВТ.Добавить("втФинальная");

ЗарплатаКадры.УничтожитьВТ(МенеджерВТ, УдалитьВТ);

4. Удаление значения из массива

ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(ВидыВремениВЗачетНормыСуммированногоУчета, ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.НеявкиПоНевыясненнымПричинам"));

5. Удаляет повторяющиеся элементы массива

Взаимодействия.УдалитьПовторяющиесяЭлементыМассива(МассивСпособовОтражений);

6. Формирует временную таблицу периодов с заданной периодичностью, формируемой, с помощью, запроса, возвращаемого методом ЗапросВТПериоды. Создает в МенеджерВременныхТаблиц временную таблицу с именем <ИмяВТ> и периодичностью <Периодичность> за интервал с <НачалоИнтервала> по <ОкончаниеИнтервала>.

ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТПериоды(Запрос.МенеджерВременныхТаблиц, НачалоПериода, ОкончаниеПериода);

ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТПериоды(МенеджерВременныхТаблиц, НачалоИнтервала, ОкончаниеИнтервала, Периодичность = "МЕСЯЦ", ИмяПоляПериод = "Период", ИмяВТ = "ВТПериоды", ИспользоватьКонецПериода = Ложь) Экспорт

6.1. Временная таблица периодического регистра с периодами

ОписаниеФильтраПолученияГрафиков = ЗарплатаКадрыПериодическиеРегистры.ОписаниеФильтраДляСоздатьВТИмяРегистра("ВТПериодыЗапросаКадровойИстории", "ФизическоеЛицо", "ФизическоеЛицо");

ЗарплатаКадрыПериодическиеРегистры.СоздатьВТИмяРегистраПериоды("КадроваяИсторияСотрудников", МенеджерВременныхТаблиц, Ложь, ОписаниеФильтраПолученияГрафиков);

7. Создать временную таблицу из таблицы значений

ЗарплатаКадры.СоздатьВТПоТаблицеЗначений(Запрос.МенеджерВременныхТаблиц, ТаблицаСКД, "ВТСКД", Истина);

8. Предупреждение на сервере

ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(

        НСтр("ru='Текст сообщения ""%1"".'"),

        СтрокаСотрудника.Сотрудник);

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

9. Создать ВТ по имени регистра СрезПоследних

9.1

ОписаниеФильтра = ЗарплатаКадрыОбщиеНаборыДанных.ОписаниеФильтраДляСоздатьВТИмяРегистра("ВТСотрудникиПериоды","Сотрудник");

ОписаниеФильтра.СоответствиеИзмеренийРегистраИзмерениямФильтра.Вставить("Период", "Период");

ОписаниеФильтра.СоответствиеИзмеренийРегистраИзмерениямФильтра.Вставить("Сотрудник", "Сотрудник");

ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТИмяРегистраСрезПоследних(

        "ГрафикРаботыСотрудников",

        МенеджерВременныхТаблиц,

        Истина,

        ОписаниеФильтра,, "ВТГрафики");

9.2

ОписаниеФильтра = ЗарплатаКадрыПериодическиеРегистры.ОписаниеФильтраДляСоздатьВТИмяРегистра("ВТФильтрПозиции", "Позиция");   

ПараметрыПостроения = ЗарплатаКадрыПериодическиеРегистры.ПараметрыПостроенияДляСоздатьВТИмяРегистраСрез();

ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(ПараметрыПостроения.Отборы, "Позиция", "<>", Справочники.ШтатноеРасписание.ПустаяСсылка());

мТиповыеПоказатели = Новый Массив;

мТиповыеПоказатели.Добавить(Справочники.ПоказателиРасчетаЗарплаты.НайтиПоРеквизиту("Идентификатор", "ПроцентПпремииПроизводственной"));

ПоказателиПремий.Добавить(Справочники.ПоказателиРасчетаЗарплаты.НайтиПоРеквизиту("Идентификатор", "ПроцентГодовойПремии"));

ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(ПараметрыПостроения.Отборы, "Показатель", "В", ПоказателиПремий);

ЗарплатаКадрыПериодическиеРегистры.СоздатьВТИмяРегистраСрезПоследних("ЗначенияПлановыхПоказателейРасчетаЗП", МенеджерВТ, Истина, ОписаниеФильтра, ПараметрыПостроения, "ВТЗначенияПлановыхПоказателейРасчетаЗП");

10. Открытие формы с последующим вызовом формы завершения

ОткрытьФорму("Справочник.Сотрудники.Форма.ФормаЭлемента",,ЭтотОбъект,,,, Новый ОписаниеОповещения("ЗагрузитьИзExcelЗавершение", ЭтотОбъект), РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

11. Сообщение пользователю из модуля объекта с параметрами

ТекстСообщения = СтрШаблон(НСтр("ru = 'Текст сообщения'"), СокрЛП(Код), Выборка.Организация, Выборка.Состояние);

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

12. Сообщение пользователю из модуля менеджера

ОбщегоНазначенияКлиентСервер.СообщитьПользователю(

        СтрШаблон(

               НСтр("ru = 'Код введен в неверном формате. Проведено преобразование из %1 в %2'"),

               СтрокаКод,

               НовыйКод),

        ,,,     Отказ);

13. Получение данных из регистра сведений не запросом

ДанныеОРаботнике = РегистрыСведений.РаботникиОрганизаций.СрезПоследних(ТекущаяДата(),Новый Структура("Сотрудник", Сотрудник));

14. Значения реквизитов:

14.1 Возврат значения реквизита объекта через точку

ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.ФизическоеЛицо, "Наименование");

14.2 Значения реквизитов, прочитанные из информационной базы для нескольких объектов

ВидыРасчета = Новый Массив;

Для Каждого СтрокаИсточника Из ТаблицаВычислений Цикл

        ВидыРасчета.Добавить(СтрокаИсточника.ВидНачисления);

КонецЦикла;

ВидыРасчетаИнфо = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(ВидыРасчета, "УчетВремениВЧасах,КатегорияНачисленияИлиНеоплаченногоВремени,ТребуетсяРасчетБазы");

15. Открытие дополнительной формы

СотрудникиКлиент.ОткрытьДополнительнуюФорму(

СотрудникиКлиентСервер.ОписаниеДополнительнойФормы("Справочник.МедицинскиеСтраховыеПолисы.Форма.ФормаПолисыПоСотруднику"), ЭтотОбъект);

16. Значение в массиве

ФизЛица = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ФизЛицо);

17. Создание временной таблицы "КадровыеДанныеСотрудников"

ОписательВТ = КадровыйУчет.ОписательВременныхТаблицДляСоздатьВТКадровыеДанныеСотрудников(Запрос.МенеджерВременныхТаблиц, "ВТСотрудникиПериоды");

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

18. Проверка даты запрета изменения данных.

ДатыЗапретаИзменения.ПроверитьДатыЗапретаИзмененияДанных(Источник, Отказ, ИсточникРегистр = Ложь, Замещение = Истина, Удаление = Ложь)

19. Получает номер документа для вывода на печать; из номера удаляются префиксы и лидирующие нули.

ТабельныйНомер = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(Сотрудник.Код, Истина, Истина);

20. Возвращает полное имя объекта метаданных по переданному значению ссылки.

ИмяТаблицы = ОбщегоНазначения.ИмяТаблицыПоСсылке(Ссылка);

21. Получить значение реквизита объектов (&НаСервере). Значения реквизита, прочитанного из информационной базы для нескольких объектов.

ФизическиеЛицаПодобранныхСотрудников = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(МассивСотрудников, "ФизическоеЛицо");

22. Запуск длительной процедуры в фоне

НаименованиеЗадания = НСтр("ru = 'Заполнение документа ""Начисление зарплаты""'");

Результат = ДлительныеОперации.ЗапуститьВыполнениеВФоне(

        УникальныйИдентификатор,

        "Документы.НачислениеЗаПервуюПоловинуМесяца.ПодготовитьДанныеДляЗаполнения",

        СтруктураПараметров,

        НаименованиеЗадания);

23. Создает временную таблицу по набору записей

ЗарплатаКадры.СоздатьВТПоНаборуЗаписей(Запрос.МенеджерВременныхТаблиц, Движения.СведенияОДоходахНДФЛ, Истина, "ВТПеренесенныеДоходы");

24. Создание и инициализация менеджера расчета зарплаты. Возвращаемое значение - обработка менеджера расчета.

МенеджерРасчета = РасчетЗарплатыРасширенный.СоздатьМенеджерРасчета(МесяцНачисления, Организация);

25. Проверка реквизита, элемента формы на существование. Получает значение элемента по указанному имени, а также проверяет, имеется ли указанное свойство.

25.1

СтруктураПараметров.Свойство("ЗначенияРазовыхПоказателей", ЗначенияРазовыхПоказателей)

25.2

Элементы.Найти("ИсполнителиРабот")

26. Ищет по имени временную таблицу в менеджере

ЗарплатаКадры.ВТСуществует(МенеджерВременныхТаблиц, "ВТПоказателиРасчета")

27. Устанавливает текст заголовка, отображаемого, когда группа свернута.

ЗарплатаКадры.НастроитьОтображениеГруппыПодписей(Элементы.ПодписиГруппа, "Объект.Руководитель", "Объект.ГлавныйБухгалтер");

28. Очищает записи наборов из коллекции Движения и проставляет флаг Записывать наборам, по которым документ уже имеет движения.

ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект);

29. Возвращает виды времени сплошной регистрации в массиве

УчетРабочегоВремениРасширенный.ВидыВремениСплошнойРегистрации()

30. Подставляет параметры в строку. Максимально возможное число параметров - 9. Возвращаемое значение - текстовая строка с подставленными параметрами.

ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибкиШаблон, Выборка.СотрудникНаименование, Формат(Выборка.Дата, "ДФ='dd.MM.yyyy ""г.""'"), Выборка.ВидВремениНаименование);

31. Получает ссылку предопределенного элемента по его полному имени.

31.1

ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.РаботаНочныеЧасы");

31.2

ОбщегоНазначения.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.РабочееВремя");

32. Проверяет корректность вводимых дат, не проверяет заполненность дат. При нахождении ошибки формирует сообщение пользователю, взводит флаг Отказ.

ЗарплатаКадры.ПроверитьКорректностьДаты(Ссылка, ДатаНачала, "Объект.ДатаНачала", Отказ, НСтр("ru='Новая дата начала'"), , , Ложь);

33. Получает значение реквизита формы.

Таблица = ОбщегоНазначенияКлиентСервер.ПолучитьРеквизитФормыПоПути(ЭтотОбъект, ИмяТаблицы);

34. Возвращает ссылку на общий модуль по имени.

Модуль = ОбщегоНазначения.ОбщийМодуль("УправленческаяЗарплата");

35. Начисления

35.1.

СотрудникиДаты = тзТаблица.Скопировать(, "Объект, Период");

СотрудникиДаты.Колонки.Объект.Имя = "Сотрудник";

ТекущиеДанныеОплатыТруда = ПлановыеНачисленияСотрудников.ТекущиеДанныеОплатыТрудаСотрудников(Параметры.Объект.Ссылка, СотрудникиДаты);

35.2.

ДанныеНачислений = ЗарплатаКадрыРасширенный.ДействующиеНачисленияСотрудников(СотрудникиДаты, Параметры.Объект.Ссылка);

36. Возвращает соответствие имен предопределенных значений по ссылкам на них.

ПредопределенныеЗначения = СтандартныеПодсистемыПовтИсп.СсылкиПоИменамПредопределенных(СПРАВОЧНИК.ВИДЫИСПОЛЬЗОВАНИЯРАБОЧЕГОВРЕМЕНИ);

37. Массив видов рабочего времени, отражающих отработанное время (ОтработанноеВремя).

УчетРабочегоВремениРасширенный.ВидыВремениОтработанноеВремяДляСуммированногоУчета()

38. Массив видов рабочего времени, отражающих норму времени для суммированного учета рабочего времени.

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

УчетРабочегоВремениРасширенный.ВидыВремениВЗачетНормыСуммированногоУчета()

39. Кадровые данные физических лиц

#Область КадровыеДанныеФизическихЛиц

КадровыйУчетРасширенный.ЗапросВТКадровыеДанныеСотрудников

...

#КонецОбласти

40. Проверка заполнения на клиенте

Если НЕ ПроверитьЗаполнение() Тогда

     Возврат;

КонецЕсли;

41. Полный путь до предопределенного значения, включая имя самого значения.

ТекущиеДанные.СпособКомпенсацииПереработки = ПредопределенноеЗначение("Перечисление.СпособыКомпенсацииПереработки.ПовышеннаяОплата")

42. Возвращает сумму значений в поле [ИмяПоля] всех элементов коллекции.

УчетСреднегоЗаработкаКлиентСервер.ИтогиПоПолю(Коллекция, ИмяПоля)

43. Подключение внешней обработки/отчета, пример оформления модуля объекта.

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область СлужебныеПроцедурыИФункции

Функция СведенияОВнешнейОбработке() Экспорт

ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.4.4.106");

ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();

        ПараметрыРегистрации.Версия = "1.0";

        ПараметрыРегистрации.БезопасныйРежим = Истина;

        ПараметрыРегистрации.Наименование = НСтр("ru = 'Добавляемая обработка'");

        НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();

        НоваяКоманда.Представление = НСтр("ru = 'Имя команды обработки'");

        НоваяКоманда.Идентификатор = "ИдентификаторКоманды";

НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();

        НоваяКоманда.ПоказыватьОповещение = Истина;

        Возврат ПараметрыРегистрации;

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

#КонецОбласти

#КонецЕсли

44. Узнать версию библиотеки стандартных подсистем - БСП

ОбновлениеИнформационнойБазыБСП.ПриДобавленииПодсистемы(Описание)

Процедура ПриДобавленииПодсистемы(Описание) Экспорт

        Описание.Имя    = "СтандартныеПодсистемы";

        Описание.Версия = "3.0.3.43";

        Описание.ИдентификаторИнтернетПоддержки = "SSL";

        Описание.РежимВыполненияОтложенныхОбработчиков = "Параллельно";

        Описание.ПараллельноеОтложенноеОбновлениеСВерсии = "2.3.3.0";

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

45. Узнать СпособОтраженияЗарплатыВБухучете у сотрудника

ОтражениеЗарплатыВБухучетеРасширенный.СоздатьВТСведенияОБухучетеЗарплатыСотрудников(Запрос.МенеджерВременныхТаблиц, "ВТСотрудники", "Сотрудник,Период", Организация);

46. Выполнить процедуру под полными правами

УстановитьПривилегированныйРежим(Истина);

 

ОписательВТ = КадровыйУчетРасширенный.ОписательВременнойТаблицыОтборовДляВТСтажиФизическихЛиц("ВТИсходныеДанные");

ОписательВТ.ИмяПоляВидСтажа = "ВидСтажа";

КадровыйУчетРасширенный.СоздатьВТСтажиФизическихЛиц(Запрос.МенеджерВременныхТаблиц, Ложь, ОписательВТ, "ВТСтажиФизическихЛиц");

 

УстановитьПривилегированныйРежим(Ложь);

47. Преобразовать строку таблицы значений в структуру

ПараметрыСтроки = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(ТаблицаПоказателей[0]);

48. Создать временную таблицу, с данными учета времени и состояний сотрудников

ПараметрыЗаполнения = УчетРабочегоВремениРасширенный.ПараметрыДляЗапросВТДанныеУчетаВремениИСостоянийСотрудников();

ПараметрыЗаполнения.ИмяВТСотрудники = "ВТСотрудникиПериоды";

ПараметрыЗаполнения.ИмяВТРезультат = "ВТУчетРабочегоВремениПолный";

ПараметрыЗаполнения.РассчитыватьПлановоеВремя = Истина;

ПараметрыЗаполнения.ДатаАктуальности  = ПериодПланирования;

ПараметрыЗаполнения.ДатаНачала = АнализируемыйГод;

ПараметрыЗаполнения.ДатаОкончания = КонецГода(АнализируемыйГод);

ПараметрыЗаполнения.МесяцДатаНачала = АнализируемыйГод;

ПараметрыЗаполнения.МесяцДатаОкончания = КонецГода(АнализируемыйГод);

ПараметрыЗаполнения.ВыделятьВыходныеВПериодыОтклонений = Ложь;

УчетРабочегоВремениРасширенный.СоздатьВТДанныеУчетаВремениИСостоянийСотрудников(Запрос.МенеджерВременныхТаблиц, Истина, ПараметрыЗаполнения);

49. Создать временную таблицу "Штатное расписание"

ПараметрыТаблицы = КадровыйУчет.ПараметрыПолученияВсехСотрудниковОрганизацийПоСпискуФизическихЛиц();

ПараметрыТаблицы.Организация = СтруктураПараметров.Организация;

ПараметрыТаблицы.НачалоПериода = СтруктураПараметров.Дата;

ПараметрыТаблицы.ОкончаниеПериода = СтруктураПараметров.Дата;

КадровыйУчет.СоздатьВТСотрудникиОрганизации(МенеджерВТ, Истина, ПараметрыТаблицы, "ВТСотрудникиПредварительно");

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

        "ВЫБРАТЬ

        |       *

        |ПОМЕСТИТЬ ВТСотрудники

        |ИЗ

        |       ВТСотрудникиПредварительно КАК ВТСотрудникиПредварительно

        |ГДЕ

        |       ВТСотрудникиПредварительно.ДатаУвольнения = ДАТАВРЕМЯ(1,1,1)

        |;

        |УНИЧТОЖИТЬ ВТСотрудникиПредварительно

        |";

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

ПараметрыТаблицы = УправлениеШтатнымРасписанием.ПараметрыПостроенияВТШтатноеРасписание(СтруктураПараметров.Дата, СтруктураПараметров.Организация);

ПараметрыТаблицы.ДополнитьОписаниемНачислений = Истина;

ПараметрыТаблицы.ПолноеОписаниеНачислений = Истина;

ПараметрыТаблицы.Вставить("ПоказыватьПлановыеПозиции");

 

УправлениеШтатнымРасписанием.СоздатьВТШтатноеРасписание(МенеджерВТ, Истина, ПараметрыТаблицы, , "ВТВыбраныПозицииШР");

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

ЗарплатаКадрыРасширенный.МногофункциональныеДокументыДобавитьЭлементыФормы(Форма, НСтр("ru='Новый'"), "ГруппаНовых", "Новый");

Элементы.Новый.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Лево;

Элементы.Новый.Доступность = Пользователи.РолиДоступны("ДобавлениеНовых");

51. Программное добавление возможности отбора в динамический список формы

Если Не Пользователи.РолиДоступны("ИспользованиеДополнителныхРеквизитов") Тогда

        Форма.Список.ТекстЗапроса = Форма.Список.ТекстЗапроса + "

        |ГДЕ

        |       Документ.НужныйРеквизит = ЛОЖЬ";

КонецЕсли;

52. Обновить список документов - аналог кнопки F5

ОповеститьОбИзменении(Тип("ДокументСсылка.РаботаВВыходныеИПраздничныеДни"));

53. Создать объект ОписаниеТипов

НоваяКолонка = ТЗ.Колонки.Добавить("КолонкаДата", ОбщегоНазначения.ОписаниеТипаДата(ЧастиДаты.Дата));

НоваяКолонка = ТЗ.Колонки.Добавить("КолонкаЧисло", ОбщегоНазначения.ОписаниеТипаЧисло(12));

НоваяКолонка = ТЗ.Колонки.Добавить("КолонкаСтрока", ОбщегоНазначения.ОписаниеТипаСтрока(100));

НоваяКолонка = ТЗ.Колонки.Добавить("КолонкаСсылка", ОбщегоНазначения.ОписаниеТипаВсеСсылки());

54. Преобразовать таблицу значений в массив

мсДанных = Новый Массив;

Для Каждого СтрокаТЗ Из тзДанных Цикл   

    стСтрокаТаблицы = Новый Структура;

    Для Каждого ИмяКолонки Из тзДанных.Колонки Цикл

        стСтрокаТаблицы.Вставить(ИмяКолонки.Имя, СтрокаТЗ[ИмяКолонки.Имя]);

    КонецЦикла;   

    мсДанных.Добавить(стСтрокаТаблицы);   

КонецЦикла;

55. Преобразовать адрес формата XML контактной информации в структуру старого формата

СтруктураАдреса = ЗарплатаКадры.СтруктураАдресаИзXML(Адрес,

ПредопределенноеЗначение("Справочник.ВидыКонтактнойИнформации.ПочтовыйАдресОрганизации"));

Адрес = СтруктураАдреса.Представление;

56. Дополнить массив МассивПриемник значениями из массива МассивИсточник

ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивПриемник, МассивИсточник, Истина);

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

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

58. Вернуть значения реквизитов объекта

ЗначенияРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Данные.ФизическоеЛицо, "ФИО,Фамилия,Имя,Отчество,УточнениеНаименования");

ФИО = Новый Структура("Фамилия,Имя,Отчество");

ЗаполнитьЗначенияСвойств(ФИО, ЗначенияРеквизитов);

59. Вернуть текущего пользователя

ТекущийПользователь=ОбщегоНазначенияУХ.ПолучитьЗначениеПеременной("глТекущийПользователь");

60. Выполнить копирование документа

ИсправлениеДокументовЗарплатаКадры.СкопироватьДокумент(Приемник, Источник, ИсключаемыеСвойства = "", ИсключаемыеТабличныеЧасти = "", ДанныеЗаполнения = Неопределено) Экспорт;

61. Подставить свой макет в СКД

СхемаКомпоновкиДанных          = ПолучитьМакет("МакетСКД");

АдресСхемыКомпоновкиДанных     = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, Новый УникальныйИдентификатор);

ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемыКомпоновкиДанных);

       

КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек);

КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

 

62. Отладить внешнюю обработку

Общий модуль ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку

Функция ПодключитьВнешнююОбработку(Ссылка) Экспорт

        СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Подключение, БезопасныйРежим = ""%1"".'"), БезопасныйРежим));

        //ИмяОбработки = Менеджер.Подключить(АдресВоВременномХранилище, , БезопасныйРежим,

        //ОбщегоНазначения.ОписаниеЗащитыБезПредупреждений());

        ИмяОбработки = Менеджер.Создать("C:\1C\МояОбработка.epf", Ложь);

        ИмяОбработки = "МояОбработка";

        Возврат ИмяОбработки;       

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

63. Схема запроса

СхемаЗапроса = Новый СхемаЗапроса;

СхемаЗапроса = УстановитьТекстЗапроса(ТекстЗапроса);

 

64. Преобразовать строковое представление УИД в ссылку на объект текущей информационной базы

ПолученныеДанные.ОсновнойДоговор = ОбменДаннымиXDTOСервер.СсылкаОбъектаПоУИДОбъектаXDTO(ДанныеXDTO.AdditionalInfo, Тип("СправочникСсылка.ДоговорыКонтрагентов"), КомпонентыОбмена);

 

65. Выполнить поиск правила конвертации объекта по имени

ПКОСвойство = ОбменДаннымиXDTOСервер.ПКОПоИмени(КомпонентыОбмена, "Справочник_ДополнительныеРеквизиты_Получение");

 

66. Вернуть объект информационной базы, соответствующий полученным данным XDTO

ТекСвойство = ОбменДаннымиXDTOСервер.СтруктураОбъектаXDTOВДанныеИБ(КомпонентыОбмена, СтрТабДопСвойств.Свойство, ПКОСвойство, "КонвертироватьИЗаписать");

процедура функция БСП временные таблицы массив регистр зарплата кадры форма запрос реквизит полезный объект ОбщегоНазначения МенеджерВременныхТаблиц Результат ЗарплатаКадры СотрудникиКлиент фильтр

См. также

GUID в 1С 8.3 - как с ними быть

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

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    4322    atdonya    22    

41

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

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

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

30.11.2023    3883    ke.92@mail.ru    16    

60

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

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

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

28.08.2023    8561    YA_418728146    6    

139

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

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

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

2 стартмани

22.08.2023    2020    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

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

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16014    131    sapervodichka    112    

129

Система контроля ведения учета [БСП]

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

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

18.07.2022    7200    quazare    8    

108
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 746 07.10.19 08:34 Сейчас в теме
У меня нет ЗарплатаКадры. Нет и БСП. Как мне быть?
Dementor; Quasar; GATTUSO; Serega-artem; alex_4x; dsdred; semagin@gmail.com; portwein; DrAku1a; ivanov660; jaroslav.h; asdf_88; CyberCerber; frkbvfnjh; BigB; zqzq; geron4; WizaXxX; Hans; Kami4; +20 Ответить
4. Kami4 07.10.19 08:56 Сейчас в теме
(1)
Согласен.
Нужно было заголовок темы изменить на "Типовые конфигурации: Полезные процедуры и функции для программиста".
DrAku1a; bulpi; itoptimum; +3 Ответить
12. MenZurKa 07.10.19 14:02 Сейчас в теме
(4) Еще и не все типовые, Розница и УТ точно не имеют механизмов ЗарплатаКадры, ЗарплатаКадрыОбщиеНаборыДанных и подобные...
_MavR_; DrAku1a; Kami4; +3 Ответить
6. acces969 339 07.10.19 09:18 Сейчас в теме
Вел когда-то подобные записи, когда начинал. Может кому - пригодится. БСП, разумеется, не используется.

Вставка рисунка в табличный документ без изменения макета
Рисунок = Шапка.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Верх = 4;
Рисунок.Высота = 22;
Рисунок.Ширина = 95;
Рисунок.Лево = 45;
Рисунок.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии,-1);
Карт = БиблиотекаКартинок.ВашаКартинка;
Рисунок.Картинка = Карт;


Программная эмуляция нажатий на кнопки клавиатуры
WSHShell = Новый COMОбъект("WScript.Shell");
      WSHShell.SendKeys("{UP}");


Пример раскраски текста форматированной строки
Если СокрЛП(ЭлементТекста) = "="
или СокрЛП(ЭлементТекста) = ">"
или СокрЛП(ЭлементТекста) = "<"
или СокрЛП(ЭлементТекста) = "*"
или СокрЛП(ЭлементТекста) = "/"
или СокрЛП(ЭлементТекста) = "+"
или СокрЛП(ЭлементТекста) = "-" тогда

ЭлементТекста = Новый ФорматированнаяСтрока(ЭлементТекста,, WebЦвета.Красный, WebЦвета.Белый);

иначеЕсли Нрег(СокрЛП(ЭлементТекста)) = "результат"
или нРег(СокрЛП(ЭлементТекста)) = "база"
или нРег(СокрЛП(ЭлементТекста)) = "размероклада"
или нРег(СокрЛП(ЭлементТекста)) = "недельнаяставканорма"
или нРег(СокрЛП(ЭлементТекста)) = "недельнаяставкафакт"
или нРег(СокрЛП(ЭлементТекста)) = "отработанодней"
или нРег(СокрЛП(ЭлементТекста)) = "отработаночасов" тогда

ЭлементТекста = Новый ФорматированнаяСтрока(ЭлементТекста,, WebЦвета.Синий, WebЦвета.Белый);

иначе
ЭлементТекста = Новый ФорматированнаяСтрока(ЭлементТекста,, WebЦвета.Белый, WebЦвета.Черный);
конецесли;
Показать


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


Нестандартное обновление конфигурации. Конфигурация поставщика так же обновляется.
1) Загрузить новую конфигурацию из файла
конфигурация - загрузить конфигурацию из файла
2) На вопрос "обновить конфигурацию БД" нажать "НЕТ"
3) Включить возможность изменения
конфигурация - поддержка - настройка поддержки - включить возможность изменения
4) Конфигурация - конфигурация базы данных - сравнить,объединить с конфигурацией базы данных
5) Отметить галками объекты, которые изменялись. Там, где стоит галка, будут взяты старые (дописанные) модули. Где галка не стоит - будут взяты из типовой конфигурации Рейтинг
6) Действия - установить режим для всех - взять из базы данных
7) Выполнить


В приложенных файлах
1. Компоновка данных СКД наглядно (блок-схема и программный код)
2. Попсовые способы решения ошибки формата потока
3. Для размышлений
Прикрепленные файлы:
Компоновка данных скд.docx
Ошибка формата потока в 1С.docx
Подключение 1с к ардуино через COM-порт.txt
Lacoste4life; SLukin; user1017560; TerveRus; Dmitryflagman; rpgshnik; HameleonA; Hans; jONES1979; muwa_; Aili; О.Ж; SkyJack; kompas-dm; ksnik; Olga12; dhurricane; NataliaZh; shard; wowik; kote; acanta; +22 Ответить
16. fenixnow 267 08.10.19 07:17 Сейчас в теме
(1) проходить мимо, эта статья не для вас
2. nomad_irk 68 07.10.19 08:44 Сейчас в теме
(0) БСП, конечно, годная подсистема, нужная, но, ИМХО, она сильно разбаловала программистов 1С......
bulpi; Kami4; +2 4 Ответить
3. QuickMix 07.10.19 08:55 Сейчас в теме
(2)да и не только БСП, а также функции работы с датами, строками, числами. Настоящие программисты перебирают в цикле каждый символ в строке, и не пользуются никакими функциями, дабы не слишком баловать себя.
user1017560; IgorS; Korolev; VladimirMelnychenko; rabid_otter; portwein; m_aster; aegoncharov; erutan; hydro2588_2015; bendarik; mark_oilbass; mivari; gulagm; memb3r; user774630; MrArmHaze; PLAstic; CyberCerber; A_Max; Kami4; +21 Ответить
17. nomad_irk 68 08.10.19 07:57 Сейчас в теме
(3) Естественно, всегда найдется тот, кто возведет что-угодно в абсолют и доведет это до абсурда :)
20. Monte Carlo 15.10.19 15:15 Сейчас в теме
(3) Настоящие программисты пишут только с использованием 0 и 1. Остальные - это избалованные лентяи.
AnKonAlm; alanto23; Hatson; Serg_1C(M); +4 Ответить
7. YannikAlx 43 07.10.19 10:02 Сейчас в теме
(2) Ну чтоб программисты не баловались нужно запретить все языки кроме Ассемблера...
Вот где ИСТИННОЕ программирование, а остальное - баловство одно... ))))))))))
portwein; Leon29; Monte Carlo; hydro2588_2015; gulagm; memb3r; user774630; MrArmHaze; KonstB; +9 Ответить
8. nomad_irk 68 07.10.19 10:10 Сейчас в теме
(7) тогда уж машинные коды, а ассемблер - для слабаков :)
Serg_1C(M); +1 Ответить
9. EvgeniuXP 07.10.19 11:06 Сейчас в теме
5. wowik 884 07.10.19 09:08 Сейчас в теме
Отлично! Сохранил себе в минимализмы.
10. ixijixi 1761 07.10.19 11:43 Сейчас в теме
Это какая-то каша
SergeyTerentyev; tolyan_ekb; SerVer1C; rpgshnik; vtsuganov; azhilichev; Oldsad; kuzyara; MishaD; user774630; CSiER; CyberCerber; +12 Ответить
11. Lus_85 07.10.19 11:59 Сейчас в теме
Поделиться наработками с общественностью это хорошо. Но еще лучше их перед этим привести в порядок, а не вываливать файл Текущаяработа.txt.
Вывод сообщения пользователю- 3 пункта, получение предопределенного - 4 пункта. Просто надерганные куски из типовой.
Вот расскажите, кто кроме разработчиков БСП и типовых на ней использует п.35.
CyberCerber; +1 Ответить
13. PLAstic 295 07.10.19 14:19 Сейчас в теме
(11) Я. Есть РИБ на 26 баз. Правила обмена обновляются в ЦБ и для всех ПБ едины. При этом ПБ обновляются в разное время региональными админами. Нужно, чтобы правила обмена отрабатывали корректно по кускам кода, которые выполняются при загрузке в ПБ с разными версиями конфигурации: где есть общий модуль и где его нет.
Вообще, с увеличением сложности КИС задействуется больше механизмов.

А по теме: да, сумбур из обескураживших в момент первого знакомства кусков кода. :)
14. AlexandrSmith 68 07.10.19 21:59 Сейчас в теме
Статья полезная, хотя мне кажется нужно несколько другую тему осветить, и соответственно другие функции представить.
Alex1053669; +1 Ответить
15. buganov 200 08.10.19 06:11 Сейчас в теме
Почему всю БСП сюда не перепечатали? Там еще много полезностей.
Кстати, СтрРазделить не взлетит на 82, так что было бы полезно указывать платформу, на которой юзать тот или иной метод.
38. DarkAn 1078 30.04.20 13:11 Сейчас в теме
(15) Разделить на платформы и конфигурации
18. vadver 39 08.10.19 13:26 Сейчас в теме
п.15 надо изложить в следующей редакции:
Функция СведенияОВнешнейОбработке() Экспорт
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.4.4.106");
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
	ПараметрыРегистрации.Версия = "1.0";
	ПараметрыРегистрации.БезопасныйРежим = Истина;
	ПараметрыРегистрации.Наименование = НСтр("ru = 'Добавляемая обработка'");
        
        МассивРазрешений = Новый Массив;
	МассивРазрешений.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Истина, Истина, ""));
	МассивРазрешений.Добавить(РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса("Word.Application",,,""));
        ПараметрыРегистрации.Разрешения = МассивРазрешений;

	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление = НСтр("ru = 'Имя команды обработки'");
	НоваяКоманда.Идентификатор = "ИдентификаторКоманды";
	НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
	НоваяКоманда.ПоказыватьОповещение = Истина;
	Возврат ПараметрыРегистрации;
КонецФункции
Показать


И тут еще нет описания массива назначений, но там просто
ПараметрыРегистрации.БезопасныйРежим = Ложь;
это очень плохая практика
Vasvas05; +1 Ответить
39. DarkAn 1078 30.04.20 13:13 Сейчас в теме
И кроме того противоречит стандартам на 1С Совместимо
19. МимохожийОднако 140 13.10.19 07:26 Сейчас в теме
До кучки..)).
Получить массив из таблицы значений в 3 строчки
Функция МассивИзТЗ(ТЗ)
ТЗ.Колонки.Добавить("ккк");
ОтборИзТЗ= Новый Структура("ккк",Неопределено);
МассивДанных=ТЗ.НайтиСтроки(ОтборИзТЗ);
Возврать МассивДанных;
КонецФункции
user659124_s.kostina; kotov2000; +2 Ответить
23. Cyberhawk 135 30.10.19 10:38 Сейчас в теме
(19) В чем польза от такого "финта"?
25. 1c-intelligence 12769 17.02.20 22:16 Сейчас в теме
(19) многовато. Можно так:
Функция МассивИзТЗ(ТЗ)
ТЗ.Колонки.Добавить("ккк");
Возврат ТЗ.НайтиСтроки(Новый Структура("ккк",Неопределено));
КонецФункции
21. acanta 15.10.19 15:44 Сейчас в теме
Современные настоящие программисты уже пишут в кубитах с вероятностью 50 процентов что 2*2 =4 и по 20% вероятности что 3 или 5 и по 5% все остальное.
40. DarkAn 1078 30.04.20 13:15 Сейчас в теме
22. AgentNiCho 18.10.19 17:46 Сейчас в теме
А я думаю полезная статья. Кое-что подсмотрел, буду использовать.
24. mm_84 14.01.20 18:42 Сейчас в теме
Оказывается, можно просто взять функции из типового отчета или документа ЗУП и выкладывать на инфостарт с заголовком "полезные функции для программиста" (ЗУП). пойду скопирую функции из БСП "Работа с файлами".
yaroslav_bondarev; Aquashop; rabid_otter; birusik; +4 1 Ответить
26. chng 06.03.20 09:21 Сейчас в теме
(24) Ваш каммент хорошо иллюстрирует тот факт, что придумать что сделать, в разы сложнее, чем реализовать придуманное...
27. rpgshnik 3625 10.03.20 03:32 Сейчас в теме
Жалко, что картинками и без оглавления
28. DrAku1a 1678 29.04.20 04:17 Сейчас в теме
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(
		Элементы,
		"ОбразованиеКвалификация",
		"Видимость",
		Объект.Учащийся);

Вместо
Элементы.ОбразованиеКвалификация.Видимость=Объект.Учащийся;

Да, весьма полезно.
Infector; z4z4z; +2 Ответить
29. platonov.e 158 29.04.20 07:36 Сейчас в теме
У меня была идея, сделать библиотеку полезных методов, которую бы наполняли программисты. Так и осталась на уровне идеи)))
31. m.bolsun 187 29.04.20 10:37 Сейчас в теме
32. platonov.e 158 29.04.20 10:51 Сейчас в теме
30. Prom-komplekt 29.04.20 07:54 Сейчас в теме
ОбщегоНазначенияКлиентСервер.СообщитьПользователю Устарела. Следует использовать ОбщегоНазначенияКлиент.СообщитьПользователю или ОбщегоНазначения.СообщитьПользователю
33. MaxPowerr 45 29.04.20 14:46 Сейчас в теме
Супер.
Возможно, кому понадобится или автор захочет добавить в свой список "вкусностей" распределение сумм, лично мне часто приходится пользоваться или у кого-то есть более красивое решение с удовольствием ознакомлюсь.
Распределение сумм (из стандартного функционала):
//МассивДляРаспределения - это массив сумм, которые являются базой для распределения
РаспределяемаяСумма = 900;
МассивСумм = Новый Массив;
Для каждого Стр из МассивДляРаспределения Цикл
	МассивСумм.Добавить(Стр.Количество);	
КонецЦикла;

МассивРезультата = ОбщегоНазначения.РаспределитьПропорционально(РаспределяемаяСумма, МассивСумм, 2);
			
Если МассивРезультата <> неопределено тогда
	Для НомерСтроки = 0 По МассивРезультата.Количество() - 1 Цикл
                //Допустим мы распределяем вес продукции
		МассивДляРаспределения[НомерСтроки].ВесНетто = МассивРезультата[НомерСтроки];
	КонецЦикла; 
КонецЕсли;
Показать
BoryaMbi; +1 Ответить
34. Infector 199 29.04.20 15:04 Сейчас в теме
Фактически отдельный модуль. Подключает записи вспомогательных регистров сведений к формам объектов, с которыми они имеют связь.

Процедура ПрочитатьНаборЗаписейРС(УпрФорма, ИмяРегистра, СтруктураОтбора, ИмяРеквизитаУФ = Неопределено) Экспорт
	
	Если ИмяРеквизитаУФ = Неопределено Тогда
		ИмяРеквизитаУФ = ИмяРегистра;	
	КонецЕсли;	
	
	Запрос = ПодготовитьЗапросНаЧтениеРегистраСведений(ИмяРегистра, СтруктураОтбора);
	
	Выборка = Запрос.Выполнить().Выбрать();
	НаборЗаписейУФ = УпрФорма[ИмяРеквизитаУФ];
	
	НаборЗаписейУФ.Очистить();
	
	Пока Выборка.Следующий() Цикл
		СтрНабора = НаборЗаписейУФ.Добавить();
		ЗаполнитьЗначенияСвойств(СтрНабора, Выборка);
	КонецЦикла;	
		
КонецПроцедуры	

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

	НаборЗаписейУФ = УпрФорма[ИмяРеквизитаУФ];

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

Процедура ПрочитатьМенеджерЗаписиРС(УпрФорма, ИмяРегистра, СтруктураОтбора, ИмяРеквизитаУФ = Неопределено) Экспорт

	Если ИмяРеквизитаУФ = Неопределено Тогда
		ИмяРеквизитаУФ = ИмяРегистра;	
	КонецЕсли;	

	МенеджерЗаписиУФ = УпрФорма[ИмяРеквизитаУФ];
	
	Запрос = ПодготовитьЗапросНаЧтениеРегистраСведений(ИмяРегистра, СтруктураОтбора);
	Выборка = Запрос.Выполнить().Выбрать();

	Если Выборка.Следующий() Тогда
		ЗаполнитьЗначенияСвойств(МенеджерЗаписиУФ, Выборка);
	Иначе
		ПустойМенеджерЗаписи = РегистрыСведений[ИмяРегистра].СоздатьМенеджерЗаписи();
		ЗаполнитьЗначенияСвойств(МенеджерЗаписиУФ, ПустойМенеджерЗаписи);
	КонецЕсли;	
	
КонецПроцедуры	

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

	Для Каждого Зн Из ЗначенияЗаполнения Цикл
		Если Не ЗначениеЗаполнено(МенеджерЗаписи[Зн.Ключ]) Тогда
			МенеджерЗаписи[Зн.Ключ] = Зн.Значение;	
		КонецЕсли;
	КонецЦикла;	
	
	Писать = Ложь;
	Для Каждого Поле Из ПроверитьЗаполнение Цикл
		Если ЗначениеЗаполнено(МенеджерЗаписи[Поле.Ключ]) Тогда
			Писать = Истина;
			Прервать;	
		КонецЕсли;	
	КонецЦикла;	
	
	Если Писать Тогда
		МенеджерЗаписи.Записать();
	Иначе
		МенеджерЗаписи.Удалить();
	КонецЕсли;
	
КонецПроцедуры

//ИмяРегистра - Имя регистра сведений, для которого читается набор
//СтруктураОтбора - Значения измерений, по которым фильтруются записи
//МенеджерЗаписи - При чтении в менеджер записи - реквизит формы,
Функция ПодготовитьЗапросНаЧтениеРегистраСведений(ИмяРегистра, СтруктураОтбора)
	
	Запрос = Новый Запрос;
	
	ТекстЗапроса = 
	
	"ВЫБРАТЬ
	|
	|&Поля
	|
	|ИЗ РегистрСведений.&ИмяРегистра КАК Т
	|
	|ГДЕ &УсловияОтбора
	|"
	;
	
	ТекстПоля = "";
	МетаданныеРС = Метаданные.РегистрыСведений[ИмяРегистра];
	
	Для Каждого Изм Из МетаданныеРС.Измерения Цикл
		ТекПоле = "Т." + Изм.Имя;
		Если ТекстПоля = "" Тогда
			ТекстПоля = ТекПоле;
		Иначе	
			ТекстПоля = ТекстПоля + "," + Символы.ПС + ТекПоле;
		КонецЕсли;	
		
	КонецЦикла;	
	
	Для Каждого Рес Из МетаданныеРС.Ресурсы Цикл
		ТекПоле = "Т." + Рес.Имя;
		Если ТекстПоля = "" Тогда
			ТекстПоля = ТекПоле;
		Иначе	
			ТекстПоля = ТекстПоля + "," + Символы.ПС + ТекПоле;
		КонецЕсли;
	КонецЦикла;	
	
	Для Каждого Рекв Из МетаданныеРС.Реквизиты Цикл
		ТекПоле = "Т." + Рекв.Имя;
		Если ТекстПоля = "" Тогда
			ТекстПоля = ТекПоле;
		Иначе	
			ТекстПоля = ТекстПоля + "," + Символы.ПС + ТекПоле;
		КонецЕсли;	
	КонецЦикла;	

	Если МетаданныеРС.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда
		ТекПоле = "Т.Период";
		Если ТекстПоля = "" Тогда
			ТекстПоля = ТекПоле;
		Иначе	
			ТекстПоля = ТекстПоля + "," + Символы.ПС + ТекПоле;
		КонецЕсли;
	КонецЕсли;
	
	ТекстУсловияОтбора = "";
	
	Для Каждого Парам Из СтруктураОтбора Цикл
		ТекОтбор = "Т." + Парам.Ключ + " = &" + Парам.Ключ; 
		
		Если ТекстУсловияОтбора = "" Тогда
			ТекстУсловияОтбора = ТекОтбор;	
		Иначе
			ТекстУсловияОтбора = ТекстУсловияОтбора + Символы.ПС + " И " + ТекОтбор;
		КонецЕсли;	
		
		Запрос.УстановитьПараметр(Парам.Ключ, Парам.Значение);
		
	КонецЦикла;	
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Поля"			, ТекстПоля);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ИмяРегистра"		, ИмяРегистра);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловияОтбора"	, ТекстУсловияОтбора);
	
	Запрос.Текст = ТекстЗапроса;
	
	Возврат Запрос;

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

Функция СтруктураНеключевыхПолейРС(ИмяРегистра, СтруктураОтбора)
	
	НеключевыеРеквизиты = Новый Структура;
	МетаданныеРС = Метаданные.РегистрыСведений[ИмяРегистра];
	
	Для Каждого Изм Из МетаданныеРС.Измерения Цикл
		Если Не СтруктураОтбора.Свойство(Изм.Имя) Тогда
			НеключевыеРеквизиты.Вставить(Изм.Имя);
		КонецЕсли;	
	КонецЦикла;	
	
	Для Каждого Рес Из МетаданныеРС.Ресурсы Цикл
		Если Не СтруктураОтбора.Свойство(Рес.Имя) Тогда
			НеключевыеРеквизиты.Вставить(Рес.Имя);
		КонецЕсли;
	КонецЦикла;	
	
	Для Каждого Рекв Из МетаданныеРС.Реквизиты Цикл
		Если Не СтруктураОтбора.Свойство(Рекв.Имя) Тогда
			НеключевыеРеквизиты.Вставить(Рекв.Имя);
		КонецЕсли;
	КонецЦикла;	

	Если МетаданныеРС.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда
		НеключевыеРеквизиты.Вставить("Период");
	КонецЕсли;
	Возврат НеключевыеРеквизиты;
	
КонецФункции	

Показать
TerveRus; +1 Ответить
35. MaxPowerr 45 29.04.20 15:10 Сейчас в теме
(34)
Было бы классно прочитать полноценную статью по использованию данного функционала.
36. Infector 199 29.04.20 15:20 Сейчас в теме
(35)может быть оформлю как-нибудь
TerveRus; user986734; +2 Ответить
41. glek 119 05.02.21 10:58 Сейчас в теме
26.
МенеджерВременныхТаблиц.Таблицы.Найти(<ИмяТаблицы>) <> Неопределено
Оставьте свое сообщение