пятница, 6 ноября 2020 г.

 

Обслуживание ИБ на PostgreSQL с использованием 1С-Обновлятора


Самый ценный ресурс в нашей жизни - время, поскольку он не возобновляем. И вот с целью экономии этого ресурса предлагаю быстрое, доступное и безопасное решение проблемы обслуживания информационных баз PostgreSQL на платформе Windows средствами программы 1С-Обновлятор от Владимира Милькина. 


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

  • ежедневное обслуживание - делаем vacuum analyze перед началом рабочего дня, но после ночного резервного копирования. Так как эта операция безобидная, то блокировать и выгонять пользователей из ИБ не будем, не беда, если кто-то в это время захочет поработать. У меня эта операция начинается в 5:00 утра, кроме воскресенья. Само собой разумеется, что все действия журналируются, и по окончании операции будет сформировано письмо системному администратору.

  • еженедельное обслуживание в ночь с субботы на воскресенье - делаем vacuum full и reindex. Поскольку эта операция серьезная, перед началом нужно сделать следующее:

    • завершим все текущие сеансы пользователей;

    • заблокируем новые сеансы и регламентные задания;

    • сделаем резервную копию ИБ.

По окончании vacuum full и reindex все разблокируем и отошлем отчет с логом по почте.


Подготовительные  настройки

Делаем эти настройки, если еще не сделали ранее:

  1. Устанавливаем 1С Обновлятор

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

  3. Настраиваем уведомления: Настройки программы -> Уведомления

  4. Поскольку скрипт vacuum_full_reindex предполагает резервное копирование, для каждой ИБ, которая будет обслуживаться, нужно настроить параметры архивирования. Для этого во вкладке "Базы"  нужно сделать следующее:

    1. встаньте на нужную базу, откройте свойства выделенной базы кнопкой "Свойства базы";

    2. в открывшемся окне свойств базы во вкладке ""Настройка" и в подвкладке "Общие" в строке ""СУБД" нажмите на ссылку "<выбрать сервер...>."

    3. при необходимости добавьте сервер, введите его параметры

    4. в окне свойств базы во вкладке "Настройка" и в подвкладке "Архивация" в группе "Куда" настройте путь для архивации этой базы, в группе "Что" поставте галочку "Включить sql архив", параноики могут поставить галочку "Дополнительно делать dt выгрузку"

  5. Параметры архивирования необходимо настроить для каждой ИБ, которую вы будете обслуживать.


Настройки скриптов обслуживания

  1. Переходим во вкладку "Скрипты" и создаем скрипт vacuum_analyze, копируем код. Не забываем прописать в PGBIN - путь до вашего PostgreSQL, а также логин и пароль к БД. Должно получиться примерно так:

  1. Не забываем выбрать базы для запуска и затем сохранится. Для особо ленивых есть кнопочка "Перенести сюда отметки из основного списка". Это просто шедевр, я без иронии, очень удобно, особенно если у вас около полусотни ИБ.

  2. Аналогично создаем и сохраняем скрипт "vacuum_full_reindex". Не забываем поставить галочки "Делать резервную копию" и "Разблокировать"



Настройка запуска по расписанию

  1. Создаем задачу "Очистка баз ежедневная" примерно с такими параметрами. В строке "Операция" в выпадающем списке выбираем "Запуск скрипта" и выбираем нужный скрипт.

  1. Аналогично создаем задачу "Очистка и индексация еженедельная" с такими параметрами. 

  1. В конечном итоге будем иметь следующее: 



Отчеты и уведомления


Если уведомления настроены, то по окончании работы скрипта будет высылаться письмо примерно вот такого содержания:

 


среда, 7 ноября 2018 г.

Получение кадровых данные сотрудников в ЗУП 3.1

//ПараметрШаблона в качестве параметра передается массив или единичный параметр из возможных указанных выше

ДанныеФизическогоЛица = КадровыйУчет.КадровыеДанныеСотрудников(Истина, Объект.Сотрудник, ПараметрШаблона);
Если ДанныеФизическогоЛица.Количество() > 0 Тогда
  ИскомыйРеквизит=ДанныеФизическогоЛица[0][ПараметрШаблона]);
КонецЕсли;






Список возможных значений ПараметровШаблона:

ФИОПолные,Пол,ТабельныйНомер,Организация,Подразделение,Должность,ДатаПриема,ДатаУвольнения,Возраст,
Фамилия, Имя, Отчество, Наименование, ФизическоеЛицоНаименование, Код, ФизическоеЛицоКод,
АдресДляИнформирования, АдресДляИнформированияПредставление, АдресЗаПределамиРФ, АдресЗаПределамиРФПредставление
АдресМестаПроживания, АдресМестаПроживанияПредставление, АдресПоПрописке,АдресПоПропискеПредставление
ТелефонДомашний, ТелефонДомашнийПредставление, ТелефонРабочий, ТелефонРабочийПредставление, EMail, EMailПредставление
ДокументПериодРегистрации, ДокументВид, ДокументКодМВД, ДокументСерия, ДокументНомер, ДокументДатаВыдачи,ДокументСрокДействия
ДокументКемВыдан, ДокументКодПодразделения, ДокументПредставление, ИнвалидностьПериодРегистрации, Инвалидность
ИнвалидностьДатаВыдачи, ИнвалидностьСрокДействияСправки, ГражданствоПериодРегистрации, Страна, ИННВСтранеГражданства,
ПроцентСевернойНадбавки, ТекущаяОрганизация, ТекущееПодразделение, ТекущаяДолжность, ТекущийВидЗанятости,
ОсновноеРабочееМестоВОрганизации, ДатаПриема, ДатаЗавершенияРаботы, ОформленПоТрудовомуДоговору, ДатаУвольнения,
ТекущаяТарифнаяСтавка, ТекущийСпособРасчетаАванса, ТекущийАванс, ДатаНачалаУчета, ПриказОПриеме, ПриказОПриемеДата,
ПриказОПриемеНомер, НазначениеПодработки, ПриказОбУвольнении, ПриказОбУвольненииДата, ПриказОбУвольненииНомер,
ПриказОбУвольненииСтатьяТКРФ, ПрекращениеПодработки, РабочееМестоПериодРегистрации, РабочееМестоРегистратор
ВидСобытия, КоличествоСтавок, ЭтоГоловнойСотрудник, УчетЗатратПериодРегистрации,
СпособОтраженияЗарплатыВБухучете, ОтношениеКЕНВД, СтатьяФинансирования, УчетЗатратДокументОснование,
ОплатаТрудаПериодЗаписи, ОплатаТрудаРегистратор, ТарифнаяСтавка, ФОТ, Надбавка, ВидЗанятостиПериодЗаписи,
ВидЗанятостиРегистратор, ВидЗанятости, АвансПериодЗаписи, АвансРегистратор, СпособРасчетаАванса, Аванс,
КлассУсловийТрудаПериодРегистрации, КлассУсловийТруда, КлассУсловийТрудаДатаРегистрацииИзменений,
ЗарплатныйПроектПериодРегистрации, ЗарплатныйПроектРегистратор, ЗарплатныйПроект, НомерЛицевогоСчета.


Стандартная функция КадровыеДанныеСотрудников:

// Возвращает таблицу значений заполненную данными сотрудников, перечисленными в 
// параметре СписокНеобходимыхДанных.
//
// Параметры:
// ТолькоРазрешенные - Булево
//  СписокСотрудников - Массив ссылок на элементы справочника сотрудники или
//        СправочникСсылка.Сотрудники.
//  КадровыеДанные -  Строка - список полей данных, перечисленных через запятую 
//      или Массив строк с полями данных, которые необходимо получить.
// ДатаПолученияДанных - дата на которую необходимо получить данные сотрудников, 
//      применимо к данным, носящим периодический характер.
//      Если дату не указывать, будут получены самые последние данные.
//
//
//  ПоляОтбораПериодическихДанных - Структура, в качестве ключа указывается имя таблицы, содержащей
//         периодические данные (например ФИОФизическихЛиц, ГражданствоФизическихЛиц).
//         В качестве значений коллекция условий отбора, 
//         соединяемых по "И" и применяемых к регистру сведений.
//         Коллекция строки которой имеют поля.
//          * ЛевоеЗначение - строка, имя поля регистра сведений.
//          * ВидСравнения - строка, вид сравнения, допустимый в языке запросов.
//          * ПравоеЗначение - значение для сравнения с полем ЛевоеЗначение.
//
// Список полей, допустимых в параметре КадровыеДанные см. КадровыйУчетВнутренний.ЗапросВТКадровыеДанныеСотрудников.
//
// Возвращаемое значение:
//   ТаблицаЗначений   - Таблица значений, содержащая запрошенные данные.
//
Функция КадровыеДанныеСотрудников(ТолькоРазрешенные, СписокСотрудников, КадровыеДанные, ДатаПолученияДанных = '00010101', ПоляОтбораПериодическихДанных = Неопределено, ФормироватьСПериодичностьДень = Истина) Экспорт
 
 // Подготовим Запрос и Менеджер временных таблиц.
 Запрос = Новый Запрос;
 Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
 
 // Сформируем временную таблицу ВТКадровыеДанныеФизическихЛиц.
 СоздатьНаДатуВТКадровыеДанныеСотрудников(Запрос.МенеджерВременныхТаблиц, ТолькоРазрешенные, СписокСотрудников, КадровыеДанные, ДатаПолученияДанных, ПоляОтбораПериодическихДанных, ФормироватьСПериодичностьДень);
 
 // Выберем кадровые данные физлиц из временной таблицы.
 Запрос.Текст = "ВЫБРАТЬ КадровыеДанныеСотрудников.* ИЗ ВТКадровыеДанныеСотрудников КАК КадровыеДанныеСотрудников";
 КадровыеДанныеСотрудников = Запрос.Выполнить().Выгрузить();
 
 Возврат КадровыеДанныеСотрудников;
 
КонецФункции

среда, 31 октября 2018 г.

Преобразование прикладных объектов (СправочникСсылка, ДокументОбъект) в данные управляемой формы (ДанныеФормыСтруктура, ДанныеФормыКоллекция) и наоборот (Толстый клиент, тонкий клиент)

Назначение: в управляемой форме в качестве реквизитов могут быть следующие типы: примитивные (дата, число, строка, булево) и ссылки (СправочникСсылка.Контрагенты, ДокументСсылка.ЗаказПокупателя и т.д.).
Прикладные объекты (СправочникОбъект, ДокументОбъект и т.д.) храниться в управляемой форме не могут. Поэтому для управляемых форм созданы аналогичные специальные типы значений (ДанныеФормыСтруктура, ДанныеФормыКоллекция и т.д). На форме эти типы обозначаются в скобках, причем в скобках указываются не сами типы, а соответствующие им прикладные объекты:



В работе часто требуется преобразовать такие типы значений управляемой формы в прикладной объект и наоборот. Для этого созданы специальные операторы (показаны ниже в коде). Важно, что:
- с их помощью можно преобразовывать только «специальные» типы значений (ДанныеФормыСтруктура, ДанныеФормыКоллекция и т.д). Для ссылок и примитивных типов преобразование не требуется;
- по синтакс-помощнику нужно смотреть, где эти операторы доступны (какие на клиенте, какие на сервере).
Источник: 
Номенклатура объектов: модуль формы объекта (справочника, документа и т.д).


&НаСервере
Процедура ПрочитатьЗаполнитьСвойстваИЗначения()
   // преобразование реквизита управляемой формы в прикладной объект
   // пример:
   // ДокументОбъект = РеквизитФормыВЗначение("Объект");
   ДокументОбъект = РеквизитФормыВЗначение("[Реквизит формы]");
   //-------------------------------------------------------------
   // преобразование прикладного объекта в реквизит управляемой формы
   // пример:
   // ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
   ЗначениеВРеквизитФормы([Прикладной объект], "[Реквизит формы]");
   //-------------------------------------------------------------
   // преобразование реквизита управляемой формы в прикладной объект
   // пример:
   // ОбъектБД = ДанныеФормыВЗначение(Объект, Тип("СправочникОбъект.Фонды"));
   ОбъектБД = ДанныеФормыВЗначение([Реквизит формы], Тип("[имя типа]"));
   //-------------------------------------------------------------
   // преобразование прикладного объекта в реквизит управляемой формы
   // пример:
   // ЗначениеВДанныеФормы(ОбъектБД, Объект);
   ЗначениеВДанныеФормы([Прикладной объект], [Реквизит формы]);
КонецПроцедуры


Проверка, что документ уже проведен (Толстый клиент, тонкий клиент)

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

Перем флПроведен Экспорт;
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
 флПроведен = Проведен;
КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
 Если Не Отказ И Не флПроведен Тогда
    ... // вносим то, что должно произойти при первом проведении
 КонецЕсли;
КонецПроцедуры


Сортировка по измерению или ресурсу в регистре сведений (Толстый клиент).

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

Процедура ПриОткрытии()
   // пример:
//ЭлементыФормы.РаботникиОрганизации.НастройкаПорядка.ПодразделениеОрганизации.Доступность = Истина;
ЭлементыФормы.[ИмяРегистраСведений].НастройкаПорядка.[Измерение].Доступность = Истина;
КонецПроцедуры

Создание в управляемой форме реквизита с типом динамический список с отбором по владельцу формы (Толстый клиент, тонкий клиент)


Назначение: создание на управляемой форме динамического списка с отбором по владельцу формы.
Номенклатура объектов: документ «Электронное письмо», реквизит «Вложения письма» (динамический список). В этот реквизит должны входить все вложения, относящиеся к данному электронному письму.
Разработка на форме:
1.Добавляем реквизит «ВложенияПисьма».




2.Свойства реквизита «ВложенияПисьма» заполняем как на рисунке



3.Нажимаем на «Настройка списка Открыть» из рис. 2 и на вкладке «Запрос» вводим код:
//-----------------------------------
ВЫБРАТЬ
ВложенияЭлектронныхПисем.Наименование,
ВложенияЭлектронныхПисем.ИмяФайла
ИЗ
Справочник.ВложенияЭлектронныхПисем КАК ВложенияЭлектронныхПисем
ГДЕ
ВложенияЭлектронныхПисем.ПометкаУдаления = ЛОЖЬ
И ВложенияЭлектронныхПисем.Объект = &Объект
//-----------------------------------

4.Перетаскиваем реквизит «ВложенияПисьма» на форму, так чтобы появилась вкладка, как на рисунке.



5.Чтобы подставить значение параметра "Объект" (который в запросе), делаем следующее: у Формы создаем событие "ПриСозданииНаСервере" (как на рисунке), в отладчике заходим в "параметры" (пкм - вычислить выражение - в поле пишем "параметры"), там находим ссылку на владельца формы (например, "СсылкаНаОбъект = Параметры.Ключ;"), далее присваиваем владельца параметру в запросе.






// код в модуле формы
//-----------------------------------
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
 СсылкаНаОбъект = Параметры.Ключ;
ВложенияПисьма.Параметры.УстановитьЗначениеПараметра("Объект",СсылкаНаОбъект);
КонецПроцедуры
//-----------------------------------