Итогом изысканий решение пришло на 6 секунд, взамен 32-ух при полном переборе от Vofka, который, в свою очередь, отправил в утиль тупой 17-ти минутный неправильный полный перебор:
ТЗ.Колонки.Добавить("Данные1", Новый ОписаниеТипов(Справочники.ТипВсеСсылки(), Документы.ТипВсеСсылки().Типы())); ТЗ.ЗагрузитьКолонку(ТЗ.ВыгрузитьКолонку("Данные"), "Данные1"); ТЗ.Свернуть("Данные1"); МассУд= ТЗ.НайтиСтроки(новый Структура("Данные1", Неопределено)); Для каждого Эл из МассУд Цикл ТЗ.Удалить(Эл); КонецЦикла;
ТЗ действительно работает ооочень быстро! 1С не обманывает, с чем всех и поздравляю! Всем спасибо!
От этой строки колонки ТЗ не становятся типизированными.
Косяк в самой возвращаемой ТЗ. Если отладчиком смотреть тип колонки, то там описание типов присутствует, но как получить состав описанных типов колонки - я не разобрался. Может, кстати, знаете?
Да какой тут код может быть, когда вся задача из двух строк(?)
Запрос= новый Запрос; Запрос.Текст= "ВЫБРАТЬ | * |ПОМЕСТИТЬ ВТ_ТЗ |ИЗ | &ТЗ КАК ТЗ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | 1 КАК ЧЧ"; Запрос.УстановитьПараметр("ТЗ", НайтиПоСсылкам(МассивСсылок)); Запрос.Выполнить().Выгрузить().ВыбратьСтроку();
Кхм... кажется - проблема ясна Либо задачу не читаем, либо подразумеваем известным, и потому не освещаем, способ приведения ТЗ из НайтиПоСсылка(...) к ТЗ с типизированными колонками за сложность, не превышающую полный перебор этой самой ТЗ циклом. ?
Запросом, к сожалению, а может - к счастью, не получается - "Тип не может быть выбран в запросе", а красивое и правильное решение в обход данной ошибки не придумалось. А "Метаданные.Справочники.Содержит(МетаданныеИЗТЗ) = Неопределено" - это решение, спасибо!
Вариант 2: а собственно, если у вас есть в запросе поле Фамилия, так отбирайте в отборе по нему.
Да, через кнопку "Дополнительно": Отфильтровать: Фамилия = Иванов Иван Иваныч Дополнительно позволяет выбрать любое поле, но пользователи этому не внемлят. Типа: "Я ткнула в фамилию, зачем мне дополнительно выбирать, что отфильтровать нужно именно по фамилии?" А в дополнительно - там видно, что подставляется Ссылка, что для расшифровки отрабатывает. Сортировка явно указана в СКД по какому именно полю, а Отбор и Оформление так и остались по ссылке.
Если сделать всё, что выше написано - то у меня фильтрует именно по фамилии.
А у меня в Отфильтровать и Офирмить пишет "Фамилия = Иванов Иван Иваныч", т.е. по ссылке фильтрует... Хелп!!
Вторая часть Марлезонского балета чуть сложна была мне для написания, хотел убедиться что не напрасно оно будет, уж простите - когда решения вот так на раз подсказывают - всё захапать сразу хочется))
Страшно подходить к навороченной системе, а после обуча - кашка в голове!
В заключении вопроса (задача решена, все довольны, а я разбираюсь с тонкостями) - Вам все премного благодарны за оперативную (доходчивую) помощь! (Ща проплюсую везде)
------------- Вторая часть балета, кстати, выглядит так (может прокомментируете)):
Перем ВыполненноеДействие; СтандартнаяОбработка=Ложь; ОбработкаРасшифровки=Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки,Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных)); ДополнительныеДействия=Новый СписокЗначений; ДополнительныеДействия.Добавить("ОткрытьФЛ","Открыть карточку Физ.лица"); // добавляем свое действие ДополнительныеДействия.Добавить("ОткрытьСотр","Открыть карточку Сотрудника"); // добавляем свое действие Настройки=ОбработкаРасшифровки.Выполнить(Расшифровка,ВыполненноеДействие,,ДополнительныеДействия); Если Настройки<>Неопределено Тогда КомпоновщикНастроек.ЗагрузитьНастройки(Настройки); ЭлементыФормы.Результат.Очистить(); СкомпоноватьРезультат(ЭлементыФормы.Результат,ДанныеРасшифровки); Иначе ИД0= новый ИдентификаторРасшифровкиКомпоновкиДанных(0); Для каждого ЭлСтр из ДанныеРасшифровки.Элементы Цикл Если ЭлСтр.Идентификатор= ИД0 Тогда продолжить; КонецЕсли; Если ВыполненноеДействие="ОткрытьФЛ" И ЭлСтр.ПолучитьПоля()[0].Поле = "_3Имя" тогда ЭлСтр.ПолучитьПоля()[0].Значение.ПолучитьФорму().Открыть(); прервать; ИначеЕсли ВыполненноеДействие="ОткрытьСотр" И ЭлСтр.ПолучитьПоля()[0].Поле = "_4Отчество" тогда ЭлСтр.ПолучитьПоля()[0].Значение.ПолучитьФорму().Открыть(); прервать; КонецЕсли; КонецЦикла; КонецЕсли;
Перед тем как писать - надо было потрудиться и попробовать работает ли фильтр. Забегая наперед сообщу, что работает. Пожалуйста, кстати.
Так не томите! Расскажите же КАК? Как заставить его по умолчанию фильтровать по Фамилии, а не по Ссылке, которую заменяет представлением Фамилия?
ОФФ: Один мой знакомый струбциной загонял тормозной поршень в суппорт - суппорт разорвало. А он очень "трудился". Модель была немецкая - поршень закручивающийся. Мораль: трудиться с нужным вектором правильно, иначе это деструкция или "мартышкин труд"))
--- По второй части - я ещё не проверил, какие данные выдаются СКД-ой при замене Представления в ДанныеРасшифровки (их я обозвал "доступные данные")
А насчёт "на уровне компоновки" - это ясно, т.к. выбор Обработкой расшифровки дополняется - это понятно. Не понятно, почему в доступных данных ОбработкиРасшифровки есть только выводимые пользователю поля, а ссылки, которые не выводятся - отсутствуют. И вот как вытащить из результатов выполнения запроса не выведенные в отчёт ссылки - тут-то и вопрос. И, не понятно, если подменить ссылку на ФизЛицо представлением Фамилией, а ссылку на Сотрудника представлением Имени, то будет ли в Обработке расшифровки доступны ссылки?
++ Замена представления успешно отрабатывается, но при такой реализации перестаёт работать сортировка и отбор по фамилии, работает по объекту, а не по представлению.
И вторая часть задачи не решается этим: при расшифровке (на выбор) предложить открытие объекта справочника Сотрудники или Физические лица
Если "для себя", то выбирайте на свой вкус. Уверен, что такие функции как "проветривание" в окнах справочника не избавят просто так этот справочник от ненужных элементов. Но если речь идёт о коммерческом продукте, то такого плана изыски, как смена оконного интерфейса на "стеклопластик", оценит далеко не каждый потенциальный использователь.
В СКД собран отчёт по сотрудникам, вывод которого настроен в закладке СКД "Настройки" как детальные записи. Отчёт вида: Фамилия | Имя | Отчество | Данные нужные | Данные контрольные
Понятно, что ФИО выбирается из регистра сведений физического лица, но расшифровка требуется как элемента справочников Физические лица и Сотрудники, на выбор. Но как расшифровать текстовые поля элементами, которые даже в отчёт не выводятся - ума не приложу.
Если кто-то боится что деньги уйдут не туда, то это проблема не 1С.
Но мы и не проблемы 1С обсуждаем, а проблемы пользователей 1С. Я, просто, знаю этот приём - использование ломаной логики, как-то так называется ))
Цитата(logist @ 10.10.11, 11:21)
В конце концов можно сделать документ, так как это реализовано в УПП.
А как Вы себе представляете этот универсальный чудо-документ внесения записи в нужный регистр сведений? Ибо, заблокировать от пользователя все регистры возможно подпиской, а в документе создать неограниченное количество возможных ресурсов, реквизитов, измерений возможно только табличной частью, где всё это будет строками. Одно изменение - одна строка. Как будто приемлемо, но вот с удобством... сколько кода писать придётся, что страшно уже на этапе фантазий. Да и времени никто не даст... А без времени - будет хуже для пользователя, что недопустимо даже для разработки.
Мне кажется постановка такой задачи несколько глуповата. Большинство записей в регистры делают документы, а те регистры в которые идет запись на прямую относятся в основном к настройкам и параметрам, и доступ к их изменению должны иметь люди, действия которых, в данном случае, не требуют логирования.
Особенно регистр сведений ЛицевыеСчетаРаботниковОрганизации в бухгалтерии, в ЗУП. Как говорил наш любимый шеф, .. .., слон кажется маленьким только издалека и лёгким, только если он чужой ))
А спереть стандартное версионирование из какой-то типовой религия не позволяет?
Да. Там версионирование на хранилище значений реализовано, не совсем понятно как из хранилища получить информацию кто поменял это или что именно поменяли в том-то. Да и не видел (может, что плохо смотрел) версионирования изменений регистров. Да и не понятно, зачем проверять дважды изменения: во время записи (а нужно ли версионировать, если ничего не изменилось) И во время поиска изменений, т.к. в хранилище там суётся объект целиком.
Цитата(logist @ 09.10.11, 6:46)
.Если существующие записи есть то: ..Если это ПЕРЕЗАПИСЬ (Новые записи <> пусто) - сравнение, очистка, запись новых, и запись изменений. ..Иначе - очистка существующих. .Иначе - записать новые записи.
Вот то-то и оно, что для регистров - всегда два вызова: из набора в пустой набор И из пустого набора в новый. Всегда изменения, а значит - нет решения задачи.
Сделал логирование действий пользователя в документ с табличными частями. Основные реквизиты документа - стандартные реквизиты объекта логирования (номер, код, регистратор, проведен и т.п.), табличная часть Измерений/Реквизитов/Ресурсов содержит описание изменения Измерений/Реквизитов/Ресурсов объекта логирования, вычисляемым по метаданным, заполняется в три колонки - Имя, Старое значение и Новое. Т.е. - логируются только изменения. ТЧ изменений в табличных частях объекта логирования - пять колонок - ИмяТЧ, НомерСтроки, ИмяРеквизита, СтароеЗначение, НовоеЗначение.
По подписке ко всем регистрам сведений, документам, справочникам на "ПередЗаписью", выполняется выборка записанной версии, сравнение с Источником, запись изменений. Но рассмотрим случай с регистром сведений - перед записью срабатывает по два раза: 1. очистка существующих записей по отбору - сравнение существующих записей с пустым набором 2. запись нового набора - сравнение пустого набора с новым набором
Таким образом, получаю два документа - спёрли все зописи по отбору И записали новый набор. По логике задачи, мне нужен один документ - что _изменили_, т.к. невозможна ситуация только стирания старых записей и отказа в записи нового набора. Но возможны ситуации - только стирания И только записи нового набора, т.е. нельзя гарантировать, что после логирования стирания возникнет обязательно логирование записи. Подскажите, как быть. Как же решить задачку-то?
Разъясните, пожалуйста, по Регистрам сведений: Есть настройка прав: Чтение, Изменение, Просмотр, Редактирование. Если снять Изменение, то и редактирование снимается. То есть, я не понимаю, как настроить так, чтобы пользователи не могли изменять существующие записи, но могли добавлять новые (??)
Вопросдва. Если у регистра есть в отборе Регистратор, как только создаётся Набор записей, то отбор пополнить реквизитами, ресурсами как-то возможно?
Необходимо создать новый регистр, пользователи не должны иметь возможности руками его править, но документами - пожалуйста. Насколько мне известно, достаточно установить режим записи - подчинение регистратору. Но тут несостыковка. Регистраторами я могу назначить документы, которые на поддержке, а значит, что при обновлении, подчинение регистратору очистится, но не есть гуд. Может, есть другой способ? Т.к., если не назначать регистратора, то и запись этим документом произведена быть не получается - неверное значение пишет мне 1С8.2.
Не уверен, что делаю всё правильно, поэтому вопросы по правильности решений (задачи переформулированы): 1. В документе имеется табличная часть с реквизитом Товары. По подписке "обработка проведения" документа, по товару отбирается склад и другие реквизиты и ресурс из периодического регистра:
Стракт= Новый Структура; Стракт.Вставить("Товар", Источник.ТабЧасть.ВыгрузитьКолонку("Товары")); СкладыТоваров= РегистрыСведений.СкладыТоваров.СрезПоследних(Источник.Дата, Стракт);
2. В документе нет указания, что он формирует движения по периодическому регистру сведений "РегСв", таким образом, как я понимаю, чистить движения нужно самостоятельно, для того чтобы получить состояние регистра на дату документа:
3. Нужно создать таблицу значений аналогичной структуры как РегСВ:
ТЗВсеСклады= НаборЗаписей.Выгрузить();
4. Полученную выборку необходимо отсортировать по реквизиту "Склад":
СкладыТоваров.Сортировать("Склад");
и при определённых условиях остальных реквизитов - опустошить значение ресурса, но так как обход идёт по неизвестному заранее сценарию (надо ли опустошать и несколько записей регистра или одну), то получается такая схема:
ПредыдущийСклад= Неопределено; ТЗОпустошения= Неопределено; ВыполнениеУсловияОпустошения= ложь; Для каждого Стр из СкладыТоваров Цикл Если ПредыдущийСклад <> Стр.Склад Тогда Если ПредыдущийСклад <> неопределено Тогда Если ВыполнениеУсловияОпустошения Тогда
Необходимо скопировать ТЗОпустошения в ТЗВсеСклады
Для каждого Стр2 из ТЗОпустошения Цикл НовСтр= ТЗВсеСклады.Добавить(); ЗаполнитьЗначенияСвойств(НовСтр, Стр2); КонецЦикла;
КонецЕсли; КонецЕсли; ПредыдущийСклад= Стр.Склад; ВыполнениеУсловияОпустошения= ложь; КонецЕсли; Если НЕ ПроверкаВыполненияУсловияОпустошения(Стр, ТЗОпустошения) Тогда Если НужноОпустошить(Стр) Тогда НовСтр= ТЗВсеСклады.Добавить(); ЗаполнитьЗначенияСвойств(НовСтр, Стр); КонецЕсли; Иначе ВыполнениеУсловияОпустошения= Истина; КонецЕсли; КонецЦикла;
и повтор кода (здесь сделано через повтор, чтобы не путать текстом оптимизации, типа - зачем добавляется пустая строка в СкладыТоваров):
Если ПредыдущийСклад <> неопределено Тогда ... КонецЕсли;
Получается, что при заполнении по Стр, а затем по вдруг необходимому заполнению по Стр2 (которая может включать в себя отдельные записи Стр, уже добавленные) в ТЗВсеСклады появятся дублирующиеся записи, которые необходимо свернуть по реквизитам и ресурсам РегСВ:
Метаданное= Метаданные.РегистрыСведений.РегСВ; СтрСвернуть= ""; Для каждого Стр из Метаданное.Реквизиты Цикл СтрСвернуть= СтрСвернуть + "," + Стр.Имя; КонецЦикла; Для каждого Стр из Метаданное.Ресурсы Цикл СтрСвернуть= СтрСвернуть + "," + Стр.Имя; КонецЦикла; ТЗВсеСклады.Свернуть(Сред(СтрСвернуть, 2));
5. И когда ТЗВсеСклады подготовлена к записи в регистр РегСВ, ведь с дублирующимися записями регистр не запишется:
Точно! Корректировка приказа - через какое время от даты поставки и/или каких факторов - списывать товар по ФИФО, независимо от перекомплектаций )))) Ур-ра! Спасибо!
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!