Введение в механизм представлений в ЗУП ред. 3
Разработка - Механизмы платформы 1С
Например, чтобы с "т.з. учета в ЗУП" получить правильные данные о плановых начислениях, надо сделать выборку не только из РС.ПлановыеНачисления, но также из РС.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников и РС.ПлановыйФОТ. А чтобы получить кадровые данные сотрудников, механизмом извлекаются данные из более чем дюжины регистров.
ВЫБРАТЬ
ФизическоеЛицо,
ОтношениеКВоинскойОбязанности
ИЗ
РегистрСведений.ВоинскийУчет.СрезПоследних(&Дата, ФизическоеЛицо В (&ФизическиеЛица))
платформа заменяет на запрос вида
ВЫБРАТЬ
T1.ФизическоеЛицо КАК ФизическоеЛицо,
T1.ОтношениеКВоинскойОбязанности КАК ОтношениеКВоинскойОбязанности
ИЗ
(ВЫБРАТЬ
T4.ФизическоеЛицо КАК ФизическоеЛицо,
T4.ОтношениеКВоинскойОбязанности КАК ОтношениеКВоинскойОбязанности
ИЗ
(ВЫБРАТЬ
T3.ФизическоеЛицо КАК ФизическоеЛицо,
МАКСИМУМ(T3.Период) КАК МаксПериод
ИЗ
РегистрСведений.ВоинскийУчет КАК T3
ГДЕ
T3.Период <= &Дата
И T3.ФизическоеЛицо В(&ФизическиеЛица)
СГРУППИРОВАТЬ ПО
T3.ФизическоеЛицо) КАК T2
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ВоинскийУчет КАК T4
ПО T2.ФизическоеЛицо = T4.ФизическоеЛицо
И T2.МаксПериод = T4.Период) КАК T1
Этот запрос точно не будет эффективным при наличии в регистре 1 млн записей. Быстрее выполнится запрос с выделением максимальных периодов во временную таблицу
ВЫБРАТЬ
T3.ФизическоеЛицо КАК ФизическоеЛицо,
МАКСИМУМ(T3.Период) КАК МаксПериод
ПОМЕСТИТЬ ВТМаксПериоды
ИЗ
РегистрСведений.ВоинскийУчет КАК T3
ГДЕ
T3.Период <= &Дата
И T3.ФизическоеЛицо В(&ФизическиеЛица)
СГРУППИРОВАТЬ ПО
T3.ФизическоеЛицо
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
T4.ФизическоеЛицо КАК ФизическоеЛицо,
T4.ОтношениеКВоинскойОбязанности КАК ОтношениеКВоинскойОбязанности
ИЗ
ВТМаксПериоды КАК T2
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ВоинскийУчет КАК T4
ПО T2.ФизическоеЛицо = T4.ФизическоеЛицо
И T2.МаксПериод = T4.Период
И механизм сформирует примерно такой же запрос. Еще раз обращаю внимание: платформа генерирует заведомо неэффективный запрос, программисты 1С используют обходной манёвр (хех, на тему обходных маневров можете поискать как собираются базы начислений и удержаний). Для получения запроса понадобится временная таблица-фильтр по физическим лицам. Она должна обязательно содержать два поля: ФизическоеЛицо и Период. Причем поле Период может быть заполнено разными значениями. Для примера сделаем фильтр из таблицы значений
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ
| ФизическиеЛица.ФизическоеЛицо КАК ФизическоеЛицо,
| ФизическиеЛица.Период КАК Период
|ПОМЕСТИТЬ ВТФизическиеЛица
|ИЗ
| &ФизическиеЛица КАК ФизическиеЛица";
Запрос.УстановитьПараметр("ФизическиеЛица", ФизическиеЛицаТаблица);
ОписаниеФильтра = ЗарплатаКадрыПериодическиеРегистры.ОписаниеФильтраДляСоздатьВТИмяРегистра("ВТФизическиеЛица", "ФизическоеЛицо");
ТолькоРазрешенные = Истина;
СрезПоследних = Истина;
ЗапросСреза = ЗарплатаКадрыПериодическиеРегистры.ЗапросВТИмяРегистраСрез("ВоинскийУчет", ТолькоРазрешенные, ОписаниеФильтра, , СрезПоследних, "ВТВоинскийУчет");
ЗарплатаКадрыОбщиеНаборыДанных.ОбъединитьЗапросы(Запрос, ЗапросСреза);
Запрос.Выполнить();
В менеджере временных таблиц мы получим искомый срез в ВТВоинскийУчет. Если поковыряться в параметрах процедур, то вы обнаружите, что, например, поля ФизическоеЛицо и Период можно переобозначить (описывая эти и другие подробности, я никогда не закончу писать статью).
Но опять о преимуществах механизма. 1С придумали т.н. "интервальные" регистры сведений. Это своего рода программно реализуемая "виртуальная таблица", в которую помещаются периоды действия регистрируемых событий. Получение среза последних при наличии такого регистра сводится к одному соединению фильтра с таблицей регистра, то есть выполняется заведомо быстрее. Для РС.ГрафикРаботыСотрудников, у которого уже есть интервальный регистр, результат вызова ЗапросВТИмяРегистраСрез вернет следующий запрос
ВЫБРАТЬ
Сотрудники.Сотрудник КАК Сотрудник,
Сотрудники.Период КАК Период
ПОМЕСТИТЬ ВТСотрудники
ИЗ
&Сотрудники КАК Сотрудники
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ИзмеренияДаты.Период КАК Период,
РегистрСведений.ДействуетДо КАК ПериодВозвратногоСобытия,
ВЫБОР
КОГДА РегистрСведений.ПериодЗаписи = РегистрСведений.ДатаНачала
ТОГДА ЛОЖЬ
ИНАЧЕ ИСТИНА
КОНЕЦ КАК ЭтоВозвратноеСобытие,
РегистрСведений.РегистраторСобытия КАК Регистратор,
ИзмеренияДаты.Сотрудник КАК Сотрудник,
РегистрСведений.ДатаОкончания КАК ДатаОкончания,
РегистрСведений.ДатаНачала КАК ДатаНачала,
РегистрСведений.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
РегистрСведений.ПериодЗаписи КАК ПериодЗаписи,
РегистрСведений.Год КАК Год,
РегистрСведений.ПериодПредыдущейЗаписи КАК ПериодПредыдущейЗаписи,
РегистрСведений.ГрафикРаботы КАК ГрафикРаботы,
РегистрСведений.РегистраторЗаписи КАК РегистраторЗаписи,
РегистрСведений.РегистраторСобытия КАК РегистраторСобытия,
РегистрСведений.ПустойИнтервал КАК ПустойИнтервал
ПОМЕСТИТЬ ВТГрафикРаботыСотрудников
{ВЫБРАТЬ
Период,
ПериодВозвратногоСобытия,
Регистратор,
Сотрудник,
ДатаОкончания,
ДатаНачала,
ГоловнаяОрганизация,
ПериодЗаписи,
Год,
ПериодПредыдущейЗаписи,
ГрафикРаботы,
РегистраторЗаписи,
РегистраторСобытия,
ПустойИнтервал}
ИЗ
ВТСотрудники КАК ИзмеренияДаты
{ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикРаботыСотрудниковИнтервальный КАК РегистрСведений
ПО (РегистрСведений.ДатаНачала <= КОНЕЦПЕРИОДА(ВЫБОР
КОГДА ИзмеренияДаты.Период = ДАТАВРЕМЯ(1, 1, 1)
ТОГДА ДАТАВРЕМЯ(3999, 12, 31, 23, 59, 59)
ИНАЧЕ ИзмеренияДаты.Период
КОНЕЦ, ДЕНЬ))
И (РегистрСведений.ДатаОкончания >= КОНЕЦПЕРИОДА(ВЫБОР
КОГДА ИзмеренияДаты.Период = ДАТАВРЕМЯ(1, 1, 1)
ТОГДА ДАТАВРЕМЯ(3999, 12, 31, 23, 59, 59)
ИНАЧЕ ИзмеренияДаты.Период
КОНЕЦ, ДЕНЬ))
И (РегистрСведений.Сотрудник = ИзмеренияДаты.Сотрудник)}
ГДЕ
ИСТИНА
{ГДЕ
РегистрСведений.Сотрудник.*}
То есть вызывая процедуру получения запроса для среза последних и т.п. мы получим функционально правильный и эффективный (будем надеяться) запрос.
Можно вместо запроса получить сразу ВТ. Соответственно, в параметре-менеджере временных таблиц уже должна быть готова ВТСотрудники
ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТИмяРегистраСрезПоследних(
"ГрафикРаботыСотрудников",
Запрос.МенеджерВременныхТаблиц,
Истина,
ЗарплатаКадрыОбщиеНаборыДанных.ОписаниеФильтраДляСоздатьВТИмяРегистра("ВТСотрудники", "Сотрудник"),
,
"ВТГрафикРаботыСотрудниковСрезПоследних");
Приведу еще один полезный пример для регистра, у которого два измерения, причем одно из них все еще называется ФизЛицо вместо принятого ныне ФизическоеЛицо, а в ВТ-фильтре поле называется как раз ФизическоеЛицо. Также в этом примере описывается дополнительный отбор, накладываемый на второе измерение
ПараметрыПостроения = ЗарплатаКадрыОбщиеНаборыДанных.ПараметрыПостроенияДляСоздатьВТИмяРегистраСрез();
ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(ПараметрыПостроения.Отборы, "ВидДокумента", "=", ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.ВидыДокументовФизическихЛиц.ПаспортРФ"));
ОписаниеФильтра = ЗарплатаКадрыПериодическиеРегистры.ОписаниеФильтраДляСоздатьВТИмяРегистра("ВТФизическиеЛица", "ФизЛицо");
ОписаниеФильтра.СоответствиеИзмеренийРегистраИзмерениямФильтра.Вставить("ФизЛицо", "ФизическоеЛицо");
ЗапросСреза = ЗарплатаКадрыПериодическиеРегистры.ЗапросВТИмяРегистраСрез("ДокументыФизическихЛиц", Истина, ОписаниеФильтра, ПараметрыПостроения, Истина, "ВТДокументыФизическихЛиц");
Также можно получить записи регистра. Это делается при помощи функций в общем модуле ЗарплатаКадрыПериодическиеРегистры: ЗапросВТИмяРегистра, СоздатьВТИмяРегистра.
Помимо срезов регистров сведений существует целый перечень готовых запросов/временных таблиц. С этим перечнем можно ознакомиться в функциях:
- ЗарплатаКадрыОбщиеНаборыДанныхРасширенный.ПолучитьЗапросПоПредставлению,
- ЗарплатаКадрыОбщиеНаборыДанныхБазовый.ПолучитьЗапросПоПредставлению.
Каждое из представлений, описанных в этих функциях, пожалуй, заслуживает отдельной темы. В этих функциях можно почерпнуть сведения о том, как получить соответствующие запросы и ВТ. Также можно глобальным поиском найти места, где это делают сами разработчики 1С.
Приведу ещё примеры использования некоторых из них. Например, данные учета времени и состояний сотрудников - таким образом вы получите ВТ с видом рабочего времени сотрудников на каждый день периода. Здесь при в сборе данных помимо регистров сведений участвуют и регистры накопления. Опять же, идейный смысл такого получения данных в том, что будут учтены отклонения, табели, индивидуальные графики и т.п.
ПараметрыЗаполнения = УчетРабочегоВремениРасширенный.ПараметрыДляЗапросВТДанныеУчетаВремениИСостоянийСотрудников();
ПараметрыЗаполнения.ИмяВТСотрудники = "ВТСотрудники";
ПараметрыЗаполнения.ИмяВТРезультат = "ВТУчетРабочегоВремени";
ПараметрыЗаполнения.РассчитыватьПлановоеВремя = Ложь;
ПараметрыЗаполнения.ДатаАктуальности = НачалоМесяца(ДатаОкончания);
ПараметрыЗаполнения.ДатаНачала = ДатаНачала;
ПараметрыЗаполнения.ДатаОкончания = ДатаОкончания;
ПараметрыЗаполнения.МесяцДатаНачала = НачалоМесяца(ДатаНачала);
ПараметрыЗаполнения.МесяцДатаОкончания = НачалоМесяца(ДатаОкончания);
ПараметрыЗаполнения.ВыделятьВыходныеВПериодыОтклонений = Ложь;
ПараметрыЗаполнения.ПолучатьУсловияТрудаИТерритории = Истина;
УчетРабочегоВремениРасширенный.СоздатьВТДанныеУчетаВремениИСостоянийСотрудников(Запрос.МенеджерВременныхТаблиц, Истина, ПараметрыЗаполнения);
Пример "двухступенчатой" выборки данных: сначала получаем кадровые данные, затем на их основании данные штатного расписания (ВТСотрудники должны быть подготовлены в МенеджерВременныхТаблиц). При этом, например, вам не надо думать, используется ли история изменения штатного расписания или нет. (Пример исправлен для 3.1.6.54)
ОписательВременныхТаблиц = КадровыйУчет.ОписательВременныхТаблицДляСоздатьВТКадровыеДанныеСотрудников(
МенеджерВременныхТаблиц,
"ВТСотрудники");
КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников(ОписательВременныхТаблиц, Истина, "ДолжностьПоШтатномуРасписанию,ВидЗанятости");
ПараметрыПостроенияВТПозицииШтатногоРасписания = УправлениеШтатнымРасписанием.ПараметрыПостроенияВТШтатноеРасписаниеПоТаблицеФильтра("ВТКадровыеДанныеСотрудников");
ПараметрыПостроенияВТПозицииШтатногоРасписания.ИмяПоляПозицияШтатногоРасписания = "ДолжностьПоШтатномуРасписанию";
ИменаСведений = Неопределено; // в переменной можно указать строкой конкретные поля: "ОкладТариф, НадбавкаЗаВредностьРазмер"
УправлениеШтатнымРасписанием.СоздатьВТПозицииШтатногоРасписанияПоВременнойТаблице(
МенеджерВременныхТаблиц, Истина, ПараметрыПостроенияВТПозицииШтатногоРасписания, ИменаСведений);
Ну а причем здесь представления? Начнем с того, что представления запросов используются в СКД. Вы указываете в запросе, что надо выбрать из таблицы-представления, в событие ПриКомпоновкеДанных вставляете процедуру ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ЭтотОбъект) и, вуаля, вместо представления запроса появляются несколько ВТ, помещенные в ваш запрос, правильно собирающие данные из базы. Пример для среза последних - получение графика работы на дату для штатных сотрудников
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Сотрудники.Ссылка КАК Сотрудник,
ВЫБОР
КОГДА &Период < ТекущиеКадровыеДанныеСотрудников.ДатаПриема
ТОГДА ТекущиеКадровыеДанныеСотрудников.ДатаПриема
ИНАЧЕ &Период
КОНЕЦ КАК Период
ПОМЕСТИТЬ ВТСотрудники
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТекущиеКадровыеДанныеСотрудников
ПО (Сотрудники.ФизическоеЛицо = ТекущиеКадровыеДанныеСотрудников.ФизическоеЛицо)
И (Сотрудники.Ссылка = ТекущиеКадровыеДанныеСотрудников.Сотрудник)
ГДЕ
ТекущиеКадровыеДанныеСотрудников.ДатаПриема <= &Период
И ТекущиеКадровыеДанныеСотрудников.ДатаПриема <> ДАТАВРЕМЯ(1, 1, 1)
И (ТекущиеКадровыеДанныеСотрудников.ДатаУвольнения = ДАТАВРЕМЯ(1, 1, 1)
ИЛИ ТекущиеКадровыеДанныеСотрудников.ДатаУвольнения >= &Период)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,
ЗНАЧЕНИЕ(Справочник.ГрафикиРаботыСотрудников.ПустаяСсылка) КАК ГрафикРаботы
ПОМЕСТИТЬ Представления_СрезПоследних_ГрафикРаботыСотрудников
ИЗ
ВТСотрудники КАК ВТСотрудники
ГДЕ
"ТолькоРазрешенные" = ИСТИНА
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Представления_СрезПоследних_ГрафикРаботыСотрудников.Сотрудник КАК Сотрудник,
Представления_СрезПоследних_ГрафикРаботыСотрудников.ГрафикРаботы КАК ГрафикРаботы
ИЗ
Представления_СрезПоследних_ГрафикРаботыСотрудников КАК Представления_СрезПоследних_ГрафикРаботыСотрудников
Пример для "предопределенного" представления я бы привел для специфической таблицы Периоды
ВЫБРАТЬ
ДАТАВРЕМЯ(1, 1, 1) КАК Период
ПОМЕСТИТЬ Представления_Периоды
ГДЕ
"НачалоИнтервала" = &НачалоПериода
И "ОкончаниеИнтервала" = &КонецПериода
И "Периодичность" = "ДЕНЬ"
И "ИспользоватьКонецПериода" = ЛОЖЬ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Представления_Периоды.Период КАК Период
ИЗ
Представления_Периоды КАК Представления_Периоды
Не забудьте прописать процедуру в ПриКомпоновкеДанных, установить тип Дата в параметрах, добавить в структуру ДетальныеЗаписи, а в выбранные поля добавить Период. И получите таблицу дат с начала по конец периода.
Об использовании представлений в СКД больше расскажет конфигурация. Так что смотрите в ПолучитьЗапросПоПредставлению и пользуйтесь глобальным поиском, не забывая ставить флажок в Макеты. Стоит также отметить, что Представления охватывают лишь небольшую часть функций .СоздатьВТ.
Вступайте в нашу телеграмм-группу Инфостарт
Представления_ ЗУП ред. 3 ЗУП 3.0 ЗУП 3.1 механизм представлений ЗапросВТ СоздатьВТ
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Инструментарий разработчика Роли и права Запросы СКД Разработчик Руководитель проекта 1С:Предприятие 8 Платные (руб)
Инструменты для разработчиков 1С 8.3 и 8.5: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.
16500 руб.
02.09.2020 286362 1611 423
Механизмы платформы 1С Разработчик Бесплатно (free)
Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?
16.07.2025 45724 TitanLuchs 109
Механизмы платформы 1С WEB-интеграция Разработчик 1С:Предприятие 8 Бесплатно (free)
В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.
14.01.2025 46876 dsdred 110
Механизмы платформы 1С Разработчик Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.
23.06.2024 40502 bayselonarrend 24
Перенос данных 1C Механизмы платформы 1С Системный администратор Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?
11.12.2023 29730 dsdred 63
СКД WEB-интеграция Разработчик 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)
Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.
2 стартмани
11.12.2023 17857 30 John_d 30
Механизмы платформы 1С Разработчик Бесплатно (free)
Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?».
06.10.2023 36405 SeiOkami 48
WEB-интеграция Универсальные функции Механизмы платформы 1С Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.
28.08.2023 32152 YA_418728146 8
А то "представления".... что это? Я бы растерялся, спроси меня вот так по телефону с утра :)
Хотя опыта в Зиках и Зупах у меня лет 15 примерно..
Эти ребята теперь постоянно чего-то ломают в ЗУП, уже всем боязно ставить новые обновления. Я так понимаю, они начали путаться в собственном говнокоде, что как видно из статьи теперь не мудрено.
Мне надо доработать макет отчета "штатной расстановки", попросили свой макет со своими группировками, колонками и прочее. 2 день сижу, не знаю с какой стороны приступить к этому кактусу, чтобы грызть не больно было. Опыт работы со всеми конфигурациями с 2006 года.
Если 1С родили такие Представления, то с ужасом ожидаю что они родят для секционирования (partition) регистров накопления :))
Релиз 3.1.6.6 пробую поискать глобальным поиском. Поставил галочки искать в "модулях" и "макетах", но находит только общие модули. Макетов в выдаче поиска нет. Что я делаю не так?
Где ещё можно посмотреть как работает этот механизм?
А так, приём полезный. Громадная простыня запроса режется на логически цельные куски, что для восприятия радикально проще.
например, первое попавшееся
|FROM
| ("+оЗапрос.Отступ(тзп_ЗаявкиСвернуто(оЗапрос), 2)+"
| ) Заявки
|
| "+оДопРекв.тзп_Джойн("СклПрог", "Заявки.Заявка", "СкладскаяПрограмма")+"
|
| LEFT JOIN ("+тзп_КомментарийПроизводства(оЗапрос)+") Коммент ON Коммент.идДок13 = Заявки.идЗадание13
|
| LEFT JOIN спрКонтрагенты Контрагенты ON Контрагенты.ID = Заявки.Контрагент
|
| LEFT JOIN ("+тзп_РезервПоЗаявке()+") Резерв ON Резерв.идЗаявка13 = Заявки.Заявка
| LEFT JOIN ("+тзп_СводныеЗадания()+") СвЗадания ON СвЗадания.идЗадание13 = Заявки.идЗадание13
может развернуться строк на сто в итоге, а так вот глядишь - и понятно более-менее
Но что-то мне подсказывает, что проблемы бы не было, если бы у продукта была четкая изначально продуманная линия развития, я не так давно посчитал, текущая типовая версия конфигурации ЗУП содержит около 1000 объектов и реквизитов с припиской "Удалить"! Продукту уже лет 5, а функционал так и не стабилизировался, снова имеем две параллельные ветки (к слову, выбрать из которых невозможно, т.к. нет информации о том какой функционал будет пилиться в "продвинутой" версии по сравнению с консервативной). Мы, конечно, привыкли к роли бета-тестеров у 1С, но не так же, блин, долго оставаться в бете...
Еще это решение негативно влияет на производительность, разработка и так отвязанная от структуры СУБД еще и будет "отвязана от структуры конфигурации"... это до добра не доводит, что я думаю многие заметили.
Извините, надо было выговориться.
превратилось все в какую-то дичь. в ЗУП 2.5 было проще, а сейчас - сколько времени надо тратить чтобы разобраться как получить список сотрудников на дату? я разобрался, но на элементарные вещи уходит по 2 часа.
ВЫБРАТЬ
ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник
ПОМЕСТИТЬ Представления_СотрудникиОрганизации
ГДЕ
"Организация" = &Организация
И "ОкончаниеПериода" = &Период
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Представления_СотрудникиОрганизации.Сотрудник КАК Сотрудник
ИЗ
Представления_СотрудникиОрганизации КАК Представления_СотрудникиОрганизации
Показатьеще есть параметры Подразделение, ОтбиратьПоГоловнойОрганизации, НачалоПериода и отобрать по списку физических лиц
Не прижилось..... то же самое будущее ждет ваши представления - нагромождения-нагромождения
КадровыйУчет.ФизическиеЛицаРаботавшиеВОрганизации
или это?
КадровыйУчет.СотрудникиОрганизации(Истина, СтруктураПараметров);
(39)
не знаю насколько "чистыми" будут данные эксперимента на обычном, несколько устаревшем, локальном компе с Win 7 и MS SQL Server 2008 R2. в пустую базу перетащил общий модуль ЗарплатаКадрыОбщиеНаборыДанных (+39 причастных модулей, 1 справочник и 2 регистра сведений).
имеем справочник 100 тыс элементов. эти элементы имеют статусы в регистре сведений ~600 тыс штук. эксперимент проводил обработкой, которая формирует выборочно какое-то количество элементов справочника, помещает их в таблицу значений, добавляя произвольный период. далее запускаем запрос среза как в платформе (не сам СрезПоследних, а то, как он платформа формирует его на SQL) и ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТИмяРегистраСрезПоследних. итого: разница ~100 мс против ~200 мс в пользу СоздатьВТИмяРегистраСрезПоследних.
а в ЗУП вот этим всем как-раз и делается попытка на высоком уровне добавить то, чего нет на низком.
скверно, конечно
Другое дело, во всём мире для этого применяются View (уже десятки лет), а тут какие-то костыли 1С-ные как всегда... Если подумать, вполне можно на уровне платформы добавить ветку метаданных view и там описывать ВТ, по аналогии с внешними источниками данных.
Добавлю,что в последних версиях ЗиУП 2.5(126,127) изменен текст запроса по формированию РасчетаПоказателей_РСВ_2017_кв1 в общем модуле РегламентированнаяОтчетность, что привело к возникновению
ошибки по задвоению сумм выплат по ФСС (р.1прил.3 РСВ)у работников, которые имели кадровое перемещение и б/л в одном отчетном периоде.
И вот как с этим жить?
Автор, ты, я смотрю, в теме. Открой секрет. Зачем?!! Зачем переименовывают реквизиты, измерения?
Как говорят в армии "Лучше безобразно, но однообразно." Ну назвали ФизЛицо, ну пусть так и живёт. Или 1С так создаёт работу программистам? Я что-то написал, клиент пользует, и после обновления мои наработки перестают работать. Потому что вместо ФизЛицо теперь надо писать ФизическоеЛицо. Кому от этого лучше? Точно не мне и не клиенту. Да и 1С тоже не лучше.
Накипело.
а в целом знаю, что ЗУП 3 разрабатывался без оглядки на ЗУП 2.5
хотя, что касается, к примеру, структуры регистров по НДФЛ доходы и расчеты, в ЗУП 3 по сравнению с ЗУП 2.5 изменились как раз только наименования)
Есть версия 3.1.6 - вот как в ней первоначально назвали реквизиты - так они теперь и живут. Срок поддержки конфы условно 3 года.
Все изменения реквизитов (т.е. несовместимость на уровне хранения данных) - только при переходе к 3.1.7.
И после этого все понимают, что написанные доработки живут 3 года, потом требуют корректировки и живут еще 3 года.
-----
P.S. Если 1с так небрежно относится к переименованию реквизитов, т.е. к обратной совместимости, то кто гарантирует, что завтра 1с также не изменит "представления"?
Это решение:
1) тяжелое (куча кода, сложно даже описать это в статье. Поэтому автор пишет "не буду описывать как переименовать поля в выборке, иначе статья бесконечная выйдет")
2) отключает конструктор запроса
3) не гарантирует, что и эти функции представлений не поменяются.
что мешает 1с также завтра переставить параметры или назвать по-другому функции обращения к представлениям? Они делают так с реквизитами, делают так с функциями в БСП - не вижу большого отличия.
Тут, имхо, проблема в головах у 1с - в жизненном цикле как самого продукта, так и сторонних доработок к ним. Это больше управленческая проблема и такие проблемы плохо решаются одной лишь автоматизацией. Выходит навороченно, дорого и неудобно. Хотя достаточно было определиться с периодами заморозки изменений в хранении данных.
1. я уже столько новшеств пережил, что это всего лишь еще одно.
2. да, отлаживать запросы стало сложнее.
3. в 3.0.25.65 были, и сейчас есть. на курсах об этом учат, а на экзамене спрашивают.
мда, обновляю 3.1.3 на последний релиз и вижу, что ребята "ушли" ВТПозицииШтатногоРасписания. bastards!
Все привыкли работать на ЗУП 2.5, к ошибкам и нюансам в которой привыкли, ведь ничего не менялось много лет! Стабильность, а тут ЗУП 3.Х 1С пилит и пилит, всякие плюшки новые и глюки, что-то чинит, что-то ломает.
Все это движение и идет оно в лучшую сторону я думаю!!!
Уж не знаю, может и сделали 6-НДФЛ потом в ЗУП2.5.
вряд ли КадровыеДанныеСотрудников помогут. в описателе ВТ можно только период (среза) указать. данные о графиках собираются в КадровыйУчетРасширенный.ЗапросВТСведенияОГрафикахРаботы и там можно увидеть получение среза последних.
если интересует именно смена графика за период, то надо пользоваться либо получением записей СоздатьВТИмяРегистра, либо получением "периодов":
ОписаниеФильтраПолученияГрафиков = ЗарплатаКадрыПериодическиеРегистры.ОписаниеФильтраДляСоздатьВТИмяРегистра("ВТСотрудники", "Сотрудник");
ЗарплатаКадрыПериодическиеРегистры.СоздатьВТИмяРегистраПериоды(
"ГрафикРаботыСотрудников",
Запрос.МенеджерВременныхТаблиц,
Истина,
ОписаниеФильтраПолученияГрафиков);в Запрос.МенеджерВременныхТаблиц должна содержаться ВТСотрудники с полями Сотрудник, ДатаНачала, ДатаОкончания.
наверно, я неправильно понял то, что требуется
ОписаниеФильтра = ЗарплатаКадрыПериодическиеРегистры.ОписаниеФильтраДляСоздатьВТИмяРегистра("ВТСотрудники", "Сотрудник");
ЗапросГрафиков = ЗарплатаКадрыПериодическиеРегистры.ЗапросВТПериодыИмяРегистра("ГрафикРаботыСотрудников", Истина, ОписаниеФильтра);
ЗарплатаКадрыОбщиеНаборыДанных.ОбъединитьЗапросы(Запрос, ЗапросГрафиков);
ЗапросПериоды = ЗарплатаКадрыОбщиеНаборыДанных.ЗапросВТПериоды(
ДатаМин,
ДатаМакс,
"ДЕНЬ",
,
"ВТПериоды");
ЗарплатаКадрыОбщиеНаборыДанных.ОбъединитьЗапросы(Запрос, ЗапросПериоды);
ЗапросСоединение = Новый Запрос(
"ВЫБРАТЬ
| ВТГрафикРаботыСотрудниковПериоды.Сотрудник,
| ВТГрафикРаботыСотрудниковПериоды.ГрафикРаботы КАК ГрафикРаботы,
| ВТПериоды.Период КАК Период
|ПОМЕСТИТЬ ВТДействиеГрафиков
|ИЗ
| ВТГрафикРаботыСотрудниковПериоды КАК ВТГрафикРаботыСотрудниковПериоды
| ЛЕВОЕ СОЕДИНЕНИЕ ВТПериоды КАК ВТПериоды
| ПО (ВТПериоды.Период МЕЖДУ ВТГрафикРаботыСотрудниковПериоды.НачалоПериода И ВТГрафикРаботыСотрудниковПериоды.КонецПериода)");
ЗарплатаКадрыОбщиеНаборыДанных.ОбъединитьЗапросы(Запрос, ЗапросСоединение); Показатьа про методологию приходится писать самому :)
Ломают они его уже много лет, ведь ни для кого не секрет. Тогда зачем, собственно, это? Доработки по ЗУП давно сводятся "на нет".
Коллеги, может кто подскажет, как получить готовую ВТ, содержащую актуальных сотрудников по физ.лицам?
Вот такой есть вариант:
ПараметрыПолученияСотрудников = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛи
ПараметрыПолученияСотрудников.Организация = Организация;
ПараметрыПолученияСотрудников.НачалоПериода = НачалоПериода;
ПараметрыПолученияСотрудников.ОкончаниеПериода = КонецПериода;
Не подходит тем, что у меня есть ТЗ с колонкой физ.лиц и начало периода у всех сотрудников может быть разным.
ОписаниеФильтра = ЗарплатаКадрыПериодическиеРегистры.ОписаниеФильтраДляСоздатьВТИмяРегистра("ВТ_ДанныеДокументов", "ФизическоеЛицо, Организация");
ТолькоРазрешенные = Истина;
ЗапросСреза = ЗарплатаКадрыПериодическиеРегистры.ЗапросВТИмяРегистра("ОсновныеСотрудникиФизическихЛиц", ТолькоРазрешенные, ОписаниеФильтра,,"ВТСотрудникиФизическихЛиц");
ЗарплатаКадрыОбщиеНаборыДанных.ОбъединитьЗапросы(Запрос, ЗапросСреза);
Запрос.Выполнить();
Не получилось, регистр ОсновныеСотрудникиФизическихЛиц - непериодический.
Проанализировал процедуры и функции из примеров, приведенных в статье.
Из них, только 2 метода:
ЗарплатаКадрыПериодическиеРегистры.ОписаниеФильтраДляСоздатьВТИмяРегистра
ЗарплатаКадрыПериодическиеРегистры.ЗапросВТИмяРегистр
находятся в области
#Область ПрограммныйИнтерфейс.
Остальные методы:
ЗарплатаКадрыОбщиеНаборыДанных.ОбъединитьЗапросы
ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТИмяРегистраСрезПоследних
ЗарплатаКадрыОбщиеНаборыДанных.ПараметрыПостроенияДляСоздатьВТИмяРегистраСрез
ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор
ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета
ЗарплатаКадрыОбщиеНаборыДанныхБазовый.ПолучитьЗапросПоПредставлению.
ЗарплатаКадрыОбщиеНаборыДанныхРасширенный.ПолучитьЗапросПоПредставлению
УчетРабочегоВремениРасширенный.ПараметрыДляЗапросВТДанныеУчетаВремениИСостоянийСотрудников
УчетРабочегоВремениРасширенный.СоздатьВТДанныеУчетаВремениИСостоянийСотрудников
КадровыйУчет.ОписательВременныхТаблицДляСоздатьВТКадровыеДанныеСотруднико
КадровыйУчет.СоздатьВТКадровыеДанныеСотрудников
УправлениеШтатнымРасписанием.ПараметрыПостроенияВТШтатноеРасписаниеПоТаблицеФильтра
УправлениеШтатнымРасписанием.СоздатьВТПозицииШтатногоРасписанияПоВременнойТаблице
находятся в так называемых служебных областях общих модулей.
Фирма 1С дает некую гарантию, что в следующих релизах не поменяются только методы,
расположенные в областях #Область ПрограммныйИнтерфейс.
Всё, что находится в других секциях - при обновлении может быть изменено фирмой 1С.
Так что если пользоваться этими методами - их надо постоянно держать на контроле,
быть готовым переделать свой код.
Согласен, придется следить. Меня, как я писал, сильно волнует корректное получение данных с т.з. функционала ЗУПа.
Вызов из программного интерфейса
ПараметрыПолучения = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
ПараметрыПолучения.Организация = Организация;
ПараметрыПолучения.НачалоПериода = НачалоМесяца(Период);
ПараметрыПолучения.ОкончаниеПериода = КонецМесяца(Период);
ПараметрыПолучения.Вставить("КадровыеДанные", "Подразделение");
ТаблицаСотрудников = КадровыйУчет.СотрудникиОрганизации(Истина, ПараметрыПолучения);Не было у кого-нибудь задачи получить данные об изменениях графиков и должностей вместе за заданный период. Сотрудник в течении месяца через Кадровые переводы меняют графики работы, подразделения (должности). Необходимо в один отчет все это получить. Отдельно ВТ с графиками работ и кадровые данные по периодам получаю, может есть типовая функция, которая все вместе позволит получить? Заранее всем спасибо.
ЗарплатаКадрыПериодическиеРегистры.ЗапросВТПериодыИмяРегистра(...) ?
Упрощает разработку и дальнейшую поддержку при обновлениях) Что конкретно - в комментарии к процедуре написано. Попробуйте сами её выполнить. Вот первый попавшийся пример использования, надо только ТаблицаФильтр подготовить.
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ТаблицаФильтр", ТаблицаФильтр);
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаФильтр.Сотрудник,
| ТаблицаФильтр.ДатаНачала,
| ТаблицаФильтр.ДатаОкончания
|ПОМЕСТИТЬ ВТТаблицаФильтр
|ИЗ
| &ТаблицаФильтр КАК ТаблицаФильтр";
Запрос.Выполнить();
ОписаниеФильтра = ЗарплатаКадрыПериодическиеРегистры.ОписаниеФильтраДляСоздатьВТИмяРегистра("ВТТаблицаФильтр", "Сотрудник");
ЗапросИнтервальногоРегистра = ЗарплатаКадрыПериодическиеРегистры.ЗапросВТПериодыИмяРегистра(
Метаданные.РегистрыСведений.КадроваяИсторияСотрудников.Имя,
Ложь,
ОписаниеФильтра);
ЗапросИнтервальногоРегистра.МенеджерВременныхТаблиц = Запрос.МенеджерВременныхТаблиц;
ЗапросИнтервальногоРегистра.Выполнить(); ПоказатьЧисто академически - это одна из процедур "программного интерфейса", которая позволяет получать данные периодического регистра сведений в некотором виде (записи, срезы, интервалы). При этом, если имеется интервальный регистр, то данные будут получены из него. Замечу, что запрос, написанный к основному регистру с учетом возвратных событий, перестанет работать при добавлении Вендором интервального регистра (а он так поступает). А при использовании программного интерфейса подобное действие останется незамеченным.
1. Правильно ли я понял, что сначала в обработке "Представления, используемые в запросах наборов данных СКД отчетов" нам сначала нужно создать это самое представление и на основании него создается запрос который мы копируем в СКД в уже готовом виде? или как то по другому это все работает не могу разобраться?
2. Можно ли где нить по подробнее желательно в виде примерf посмотреть или почитать как это все реализуется на практике?
Откройте СКД и модуль объекта печатной формы Т-1. Поставьте точку останова после исполнения процедуры ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(...). Сформируйте отчет. Сравните тексты запросов в СКД и в наборе данных схемы компоновки данных объекта.
В процедуре ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц используется код:
ПозицияСловаПоместить = СтрНайти(ТекстЗапросаВРег, "ПОМЕСТИТЬ ");
Т.е. обязательно пробел после ПОМЕСТИТЬ, а, следовательно конструкция с переводом на новую строку уже не прокатит... Качество кода типовых конфигураций ужасающее. (
Подобная ситуация позволяет плодить "копипастеров", т.к. в случае непонятного поведения, приходится брать код запроса из самих конфигураций, либо из примеров. Написать свой сразу не у всех получится.
Мне вообще интересно, авторы этого механизма тестировали создание дополнительных внешних печатных форм в расширении или внешней обработке на основе типовых? Скорее всего даже не задумывались.
1. Добавил новый отчет и сформировал так называемый запрос -пустышку и вставил его в СКД
ВЫБРАТЬ
ДАТАВРЕМЯ(1, 1, 1) КАК Период,
ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,
ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,
ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность
ПОМЕСТИТЬ Представления_КадровыеДанныеСотрудников
ИЗ
ВТСотрудникиПериоды КАК СотрудникиПериоды2. Настройка ===>Выбранные поля добавил(сотрудник, должность)
3. Настройки отчет ===> Детальные записи
4. В модуле объекта добавил
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ИнициализироватьОтчет()
КонецПроцедуры
Процедура ИнициализироватьОтчет() Экспорт
ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ЭтотОбъект);
КонецПроцедуры
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
//Настройки.События.ПередЗагрузкойНастроекВКомпоновщик = Истина;
КонецПроцедуры
Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка);
ИнициализироватьОтчет()
КонецПроцедуры ПоказатьЗапускаю, нажимаю сформировать и пусто. Почему, что я сделал не так?
ВЫБРАТЬ РАЗРЕШЕННЫЕ
&Период КАК Период,
Сотрудники.Ссылка КАК Сотрудник
ПОМЕСТИТЬ ВТСотрудники
ИЗ
Справочник.Сотрудники КАК Сотрудники
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,
ДАТАВРЕМЯ(1, 1, 1) КАК Период,
ЗНАЧЕНИЕ(Справочник.ШтатноеРасписание.ПустаяСсылка) КАК ДолжностьПоШтатномуРасписанию,
ЗНАЧЕНИЕ(Перечисление.ВидыЗанятости.ПустаяСсылка) КАК ВидЗанятости
ПОМЕСТИТЬ Представления_КадровыеДанныеСотрудников
ИЗ
ВТСотрудники КАК ВТСотрудники
ГДЕ
"ТолькоРазрешенные" = ИСТИНА
И "Период" = &Период
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Представления_КадровыеДанныеСотрудников.Сотрудник КАК Сотрудник,
Представления_КадровыеДанныеСотрудников.Период КАК Период,
Представления_КадровыеДанныеСотрудников.ДолжностьПоШтатномуРасписанию КАК ДолжностьПоШтатномуРасписанию,
Представления_КадровыеДанныеСотрудников.ВидЗанятости КАК ВидЗанятости
ИЗ
Представления_КадровыеДанныеСотрудников КАК Представления_КадровыеДанныеСотрудников ПоказатьДа. Вы внимательны. Для формирования отчета с представлениями в ЗУП в его модуль объекта достаточно добавить
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ЭтотОбъект);
КонецПроцедурыВы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 841337
Создание 04.06.18 14:13
Обновление 04.06.18 14:13
Просмотры 93441
Загрузки 0
Рейтинг
302
Комментарии 102
Код открыт Да
Рубрики Механизмы платформы 1С СКД
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1С:Зарплата и Управление Персоналом 3.x
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)