Как бы нам дать такой инструмент, чтобы неприятности вылезали самым неожиданным образом. Чтобы простота первоначальных простой настройки выливалось в часы бесплодных поисков решений. Чтобы у тебя все работало, а у ответственного пользователя зависало на полчаса. И так мы немного поговорим о динамических списках в 1С.
Доброе время суток!
Как же легко и просто создать в 1С динамический список, написать понятный запрос и проставить необходимые поля.Но с течением времени количество таблиц в запросе увеличивается в 2-4 раза, количество полей в таблице растет. А количество записей растет очень быстро и за год может достигать миллиона и более в основной таблице.
И вот тут-то и начинается ОСОБЕННОСТЬ работы динамических списков. Первоначальное открытие формы начинает висеть долго, но не у всех и не всегда. Но новые пользователи конечно же должны первоначально прождать минут 20 для получения первичных данных.
И тут приходит время «Доработать» эти списки…
Первое до чего хотят добраться руки — Убрать динамическое считывание данных.
Из its 1C: Динамическое считывание данных включено (рекомендуется) https://its.1c.ru/db/v8std#content:732:hdoc:_top:%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA
Но это позволит убрать долгое зависание при прокрутке списка.
Второе это убрать загрузку кучи картинок привязной к этому списку, ну если до Вас этот список писали студенты на макете из трех документов…
Третье уже более существенное это вытащить все дополнительные данные в ПриПолученииДанныхНаСервере(https://wonderland.v8.1c.ru/blog/obrabotka-i-oformlenie-dannykh-dinamicheskogo-spiska/) чтобы разгрузить основной запрос.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
//Получаем состояние задания Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДокументВМСменноеЗадание.Ссылка КАК Ссылка, | ВЫБОР | КОГДА ДокументВМСменноеЗадание.Отмена | ТОГДА 5 | КОГДА СостоянияСменныхЗаданийМК.Диспетчер = ИСТИНА | ТОГДА СостоянияСменныхЗаданийМК.Состояние + 2 | ИНАЧЕ ЕСТЬNULL(СостоянияСменныхЗаданийМК.Состояние, 0) | КОНЕЦ КАК СостояниеИндекс, | ЕСТЬNULL(СостоянияСменныхЗаданийМК.Состояние, 0) КАК Состояние, | ЕСТЬNULL(СостоянияСменныхЗаданийМК.ОбъемПодбора, 0) КАК ОбъемПодбора, | ЕСТЬNULL(СостоянияСменныхЗаданийМК.Комментарий, """") КАК ПричинаНевыполнения, | ЕСТЬNULL(вмИсторияВыгрузкиДанныхВЦУР.ДатаПоследнейВыгрузки, """") КАК ДатаПоследнейВыгрузкиЦУР, | ЕСТЬNULL(вмИсторияВыгрузкиДанныхВЦУР.ИдентификаторЗадачи, """") КАК ИдентификаторЗадачиЦУР, | ЕСТЬNULL(вмИсторияВыгрузкиДанныхВЦУР.Ответственный, """") КАК ОтветственныйЦУР, | ЕСТЬNULL(вмИсторияВыгрузкиДанныхВЦУР.СостоянияСменногоЗаданияПоНавалам, """") КАК СостоянияСменногоЗаданияПоНавалам |ИЗ | Документ.ВМСменноеЗадание КАК ДокументВМСменноеЗадание | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияСменныхЗаданийМК.СрезПоследних(, СсылкаНаОбъект В (&СписокСменныхЗаданий)) КАК СостоянияСменныхЗаданийМК | ПО ДокументВМСменноеЗадание.Ссылка = СостоянияСменныхЗаданийМК.СсылкаНаОбъект | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.вмИсторияВыгрузкиДанныхВЦУР КАК вмИсторияВыгрузкиДанныхВЦУР | ПО ДокументВМСменноеЗадание.Ссылка = вмИсторияВыгрузкиДанныхВЦУР.Объект |ГДЕ | ДокументВМСменноеЗадание.Ссылка В(&СписокСменныхЗаданий)"; Запрос.УстановитьПараметр("СписокСменныхЗаданий", Строки.ПолучитьКлючи()); ВыборкаЗапроса = Запрос.Выполнить().Выбрать(); Пока ВыборкаЗапроса.Следующий() Цикл CтрокаСписка = Строки[ВыборкаЗапроса.ССылка]; CтрокаСписка.Данные["Состояние"] = ВыборкаЗапроса.Состояние; CтрокаСписка.Данные["СостояниеИндекс"] = ВыборкаЗапроса.СостояниеИндекс; CтрокаСписка.Данные["ОбъемПодбора"] = ВыборкаЗапроса.ОбъемПодбора; //Невидимые поля не надо устанавливать - ошибка //CтрокаСписка.Данные["ПричинаНевыполнения"] = ВыборкаЗапроса.ПричинаНевыполнения; CтрокаСписка.Данные["ДатаПоследнейВыгрузкиЦУР"] = ВыборкаЗапроса.ДатаПоследнейВыгрузкиЦУР; CтрокаСписка.Данные["ИдентификаторЗадачиЦУР"] = ВыборкаЗапроса.ИдентификаторЗадачиЦУР; CтрокаСписка.Данные["ОтветственныйЦУР"] = ВыборкаЗапроса.ОтветственныйЦУР; CтрокаСписка.Данные["СостоянияСменногоЗаданияПоНавалам"] = ВыборкаЗапроса.СостоянияСменногоЗаданияПоНавалам; КонецЦикла; |
Важно понимать. что по этим данным мы не может сортировать или отбирать строки списка.
В четвертых — одно из самых главных это вставить отборы сразу в функцию ПриСозданииНаСервере — это уменьшит кардинально количество получаемых данных.
1 2 3 4 5 6 7 8 9 10 |
Если ПервоеОткрытиеФормы Тогда //Всегда при первом открытии устанавливаем период сегодня Список.Параметры.УстановитьЗначениеПараметра("НачалоПериода", НачалоДня(ТекущаяДата())); Список.Параметры.УстановитьЗначениеПараметра("КонецПериода", КонецДня(ТекущаяДата())); Иначе Если ЗначениеЗаполнено(НачалоПериода) И ЗначениеЗаполнено(КонецПериода) Тогда Список.Параметры.УстановитьЗначениеПараметра("НачалоПериода", НачалоПериода); Список.Параметры.УстановитьЗначениеПараметра("КонецПериода", КонецПериода); КонецЕсли КонецЕсли; |
Кнопка выбора периода работает на фильтрацию полученных данных, лучше переопределить ее
1 2 3 4 5 6 7 8 9 10 11 |
&НаКлиенте Процедура УстановитьИнтервалЖурнала(Команда) Диалог = Новый ДиалогРедактированияСтандартногоПериода(); Диалог.Период = Новый СтандартныйПериод(ВариантСтандартногоПериода.Сегодня); Если Диалог.Редактировать() Тогда Элементы.Список.Период = Диалог.Период; УстановитьПараметрыСписка(Ложь, Диалог.Период.ДатаНачала, Диалог.Период.ДатаОкончания); КонецЕсли; КонецПроцедуры |
И лучше убрать или сделать недоступным строку состояния такого списка, иначе пользователи будут путаться при убирании отбора по этому параметру.