Ну начнем с того что в первом примере я работаю не с табличной частью! То есть ничего позиционировать не нужно, но все равно не работает!
практика недвусмысленно свидетельствует о том, что в подобных случаях "ну начинать" лучше всего с отладчика. например, поставить точку прерывания на операторе присвоения (в стартовом коде - на строке с "ЗаголовокП=ДокументОснование.ЗаголовокПФ;"). когда выполнение дойдет до точки останова - открыть табло (кнопка панели инструментов "открыть табло" или меню-Отладка-Табло), и в нем посмотреть значения (набрать вычисляемые выражения построчно), например такие:
Метаданные.Документ(ДокументОснование.Вид()).РеквизитШапки("ЗаголовокПФ").Выбран() Метаданные.Документ(ДокументОснование.Вид()).РеквизитТабоичнойЧасти("ЗаголовокПФ").Выбран() ТипЗначенияСтр(ДокументОснование.ЗаголовокПФ) ДокументОснование.ЗаголовокПФ // и т.п.
возможно что-то прояснится?..
прим.: я надеюсь, что ЗаголовокП - это все-таки переменная? описано через "Перем"? а то если реквизит - то при несовпадении типов/видов вполне себе может ничего не присвоить.
баттюшки-светы ужас то какой! так ведь для получения реквизита таб.части - надо сначала спозиционироваться на строке, из которой этот реквизит надо дёрнуть. в данном случае - спозиционироваться на той строке документа (ДокументОснование=ТекущийДок.СсылкаНаДокОсн;), по которой был свформирован (ТекущийДок). например, прямым перебором с проверкой некоего условия (соответствия строки таб.части) с прерыванием, типа
ДокументОснование.ВыбратьСтроки(); Пока ДокументОснование.ПолучитьСтроку()<>0 Цикл Если <По этой строке сформирован ТекущийДок> Тогда Прервать КонецЕсли КонецЦикла; // и вот тут ЗаголовокП=ДокументОснование.ЗаголовокПФ; вернет вожделенное значение
И тогда нельзя будет искать товар по уникальному коду
уникальность в пределах подчинения дает уникальный полный код, по которому тоже можно искать. ну да не суть. в сторону такой структуры нумерации, как выше сказано можно использовать "УстановитьНовыйКод(СтрЗаменить(Родитель.ПолныйКод(),"/",""))", например, в ПриЗаписи прим.: при переносе из группы в группу тоже.
Цікавить така річ: нехай на довільній формі (обробка, звіт) є N реквізитів, індентифікатор яких "рекв1", "рекв2"..."реквN". Як їм автоматично в циклі присвоїти значення? Така річ як Форма.ПолучитьАтрибут(ИмяРеквизита) викор. успішно для встановлення в циклі видимості, доступності реквізиту; от присвоїти значення не вийде. Чи можливо це зробити стандартними можливостями 1С?
Потом смотрим в "описание встроенного языка", глава "процедуры и функции форматирования" - а именно на описание функции "Шаблон". И внезапно ловим озарение - обана, да ведь там в параметре можно любое выражение всунуть - в том числе вызов функции, которая как-то изменяет свои параметры!!! Под действием озарения и в продолжение его пишем (лучше сразу в ГМ) вот такую, например, полезную функцию:
Функция глПрисвоитьЗначение(Знач парИсточник,парПриемник="") Экспорт Перем тТип; тТип=ТипЗначенияСтр(парИсточник); Если Прав(тТип,8)="Значений" Тогда парПриемник=СоздатьОбъект(тТип); парИсточник.Выгрузить(парПриемник); ИначеЕсли тТип="Справочник" Тогда парПриемник=парИсточник.ТекущийЭлемент(); ИначеЕсли тТип="Документ" Тогда парПриемник=парИсточник.ТекущийДокумент(); ИначеЕсли тТип="Счет" Тогда парПриемник=парИсточник.ТекущийСчет(); Иначе парПриемник=парИсточник; КонецЕсли; Возврат(парИсточник); КонецФункции //глПрисвоитьЗначение
А в модуле формы, где нам надо присвоить реквизиту(!)формы с именем, ну, допустим, "Фигня1" значение, хранящееся в переменной, ну, допустим, "ЗначениеДляФигни1", озаренные такие, смело пишем:
Кстати, эта "задняя дверь" сильно не нравится самой фирме 1С. Настолько не нравится, что использование функции "Шаблон" для чего-либо кроме форматирования в любой конфигурации - практически крест на возможности сделать её "1с-совместимо".
// Модуль Формы внешней обработки // На Форме должны наличествовать: // - ТаблицаЗначений с наименованием ПечТЗ; // - Кнопка с формулой "Сформировать()" (без кавычек)
//============================================================================== Процедура ДобавитьСтрокуДанныхПоТекРазвороту(тБухИт,тПечТЗ,тКвоСубконто,тВалюта="") тПечТЗ.НоваяСтрока(); тПечТЗ.ПолучитьСтрокуПоНомеру(тПечТЗ.КоличествоСтрок()); тПечТЗ.Счет=тБухит.Счет; Для СчСубконто=1 По тКвоСубконто Цикл тПечТЗ.УстановитьЗначение(тПечТЗ.НомерСтроки,"Субконто"+СчСубконто,тБухИт.Субконто(СчСубконто)) КонецЦикла; тПечТЗ.СуммаДт=тБухит.СКД("С"); тПечТЗ.СуммаКт=тБухит.СКК("С"); тПечТЗ.Валюта=тВалюта; Если ПустоеЗначение(тВалюта)<>1 Тогда тПечТЗ.ВалСуммаДт=тБухИт.СКД("В"); тПечТЗ.ВалСуммаКт=тБухИт.СКК("В"); КонецЕсли; КонецПроцедуры //ДобавитьСтрокуДанныхПоТекРазвороту //------------------------------------------------------------------------------ Процедура ДоРазвернутьПоСубконто(тБухит,тКвоСубконто,тПечТЗ,ТекВыбСубконто=1) Если ТекВыбСубконто<=тКвоСубконто Тогда тБухит.ВыбратьСубконто(); Пока тБухит.ПолучитьСубконто()<>0 Цикл ДоРазвернутьПоСубконто(тБухит,тКвоСубконто,тПечТЗ,ТекВыбСубконто+1) КонецЦикла; ИначеЕсли тБухИт.Счет.Валютный<>0 Тогда тБухит.ВыбратьВалюты(); Пока тБухит.ПолучитьВалюту()<>0 Цикл ДобавитьСтрокуДанныхПоТекРазвороту(тБухИт,тПечТЗ,тКвоСубконто,тБухИт.Валюта) КонецЦикла; Иначе ДобавитьСтрокуДанныхПоТекРазвороту(тБухИт,тПечТЗ,тКвоСубконто) КонецЕсли; КонецПроцедуры //ДоРазвернутьПоСубконто //------------------------------------------------------------------------------ Процедура Сформировать() Перем тБухИт,счСубконто; тБухит=СоздатьОбъект("БухгалтерскиеИтоги"); Для счСубконто=1 По МаксКвоСубконто Цикл тБухИт.ИспользоватьСубконто(,,1,0) КонецЦикла; тБухит.ВключатьСубсчета(-1); тБухит.ВыполнитьЗапрос(,ВыбДата,,,,"СВ",,3); тБухИт.ВыбратьСчета(); Пока тБухИт.ПолучитьСчет()<>0 Цикл ДоРазвернутьПоСубконто(тБухИт,тБухит.Счет.КоличествоСубконто(),ПечТЗ) КонецЦикла; Если ПечТЗ.КоличествоСтрок()<>0 Тогда ПечТЗ.Сортировать("+Счет,"+тхтКолСубконто,1); ПечТЗ.ТекущаяСтрока(1); КонецЕсли; КонецПроцедуры //Сформировать //==============================================================================
Возможность проверки изменений Документа, записанного в реквизит типа Документ, с момента открытия формы (объекта) с таким реквизитом. <НаименованиеРеквизитаСДокументом>.<МетодыПолученияДанныхИлиПростоСсылкиНаРеквизиты> - дадут те значения, которые были в этом документе на момент откытия формы (объекта?) с таким реквизитом; ВремДок=<НаименованиеРеквизитаСДокументом>.ТекущийДокумент(); ВремДок.<МетодыПолученияДанныхИлиПростоСсылкиНаРеквизиты> - дадут актуальные данные из этого документа (на момент выполнения кода). Иногда бывает полезным, напримерЮ, при проверке в ПриЗаписи подчиненного документа - а не был ли кем-то вдруг как-то изменен ДокументОснование?.. Хотя и не только для этого. (да, парадоксально, но факт - если знать, что при открытии формы движок 1с кэширует все объекты данных агрегатных типов, ссылки на которые есть в открываемой форме)
Ускорение получения остатков по "неполным" разрезам измерений с методом "ПолучитьСводныйОстаток". В 1с к регистрам (как правило) строятся индексы, которые составляются из значений измерений, идущих в порядке их следования в метаданных. при этом, если в списке измерений при использовании подобного метода измерения идут с самого начала списка парамептров без "пропусков" - то движок 1с для получения этих данных использует указанные индексы; если жде в списке фильтра по измерениям встречается пропуск измерения - а это бывает нужно, если нужен итог по всем значениям такого измерения сводно, без фильтации - то для получения итогов используется простой перебор(!) таблицы итогов. Поэтому в случаях, когда это возможно, вместо получения сводного остатка с пропуском значений измерений бывает оптимальнее совершать вместо одного запроса с пропуском несколько запросов без пропусков, с подстановкой в это реквизит всех возможных значений и подсуммированием.
Использование в измерениях регистров / видах субконто агрегатных типов данных (Документ,Справочник) с не указанным явно видом. В модулях проведения документов типовых конфигураций как правило стоит "присвоение в лоб" значения субконто/измерения из реквизита документа. При этом реквизит документа может быть пустым(!!!!) Документом/Справочником определенного(!!!!) вида. В результате такой безалаберности могут копиться итоги с НЕСКОЛЬКИМИ ПУСТЫМИ значениями СУБКОНТО/ИЗМЕРЕНий. Особенно феерично это выглядит, например, когда в ОСВ "откуда ни возьмись" болтаются несколько сальдо/оборотов по совершенно "одинаковым" пустым значениям субконто. С некоторых пор лично я для избегания такой ситуации сразу перелопачиваю модули проведения документов: прямые присвоения значений субконто-измерениям "обрамляю" в если-проверку этих значений на непустое значение (если таки там это значение пустое - лучше вообще не присваивать значение субконто/измерению, это гарантирует отсутствие "расползания" итогов/оборотов по нескольки "одинаковым, но все-таки разным" пустым значениям субконто/измерений, и кроме того, упрощает последующий доступ к итогам/оборотам по именно пустым значениям субконто/измерений в случае необходимости).
1. Ввести реквизит (возможно общий) для флага необходимости пере-позиционирования документов.
2. В ПриЗаписи() документов. 2.1. Для новых документов - сверять ДатаДок на равенствоТекущаяДата(), а ТекущееВремя() на попадание в "интервалом перепозиционирования"(23:00:00-23:59:59): если совпадает+попадает - взводить флаг необходимости пере-позиционирования(см.п.1) в единицу. 2.2. Для ранее созданных документов - сверять ДатаДок на равенствоТекущаяДата(), а ТекущийДокумент().ПолучитьВремя() на попадание в "интервалом перепозиционирования"(23:00:00-23:59:59): если совпадает+попадает - взводить флаг необходимости пере-позиционирования(см.п.1) в единицу.
3. В ПриОткрытии() ранее созданных документов. Если ( необходимости пере-позиционирования(см.п.1) взведен в единицу ) И ( ДатаДок < ТекущаяДата() ): СтатусВозврата(0) с выдачей сообщения о тотм, что документ необходимо перепозиционировать в рамках регламента (можно с координатами для связи с работниками/службами, ответственными за выполнение этого пункта регламента).
4. В описываемой обработке - после "расстановки" документов по хронологии - сбрасывать(обнулять) в них флаг необходимости пере-позиционирования(см.п.1).
Результат - гарантированное отсутствие блокиоровок при выполнении упомянутой обработки документов ("расстановки" документов по хронологии).
прим.: форс-мажорные корректировки до "расстановки" документов по хронологии - также вопрос в принципе решаемій. если надо.
add: вместо реквизита можно использовать справочник (можно динамичесский).
vadim007 Это не баг, скорее недокументированная особенность. При открытии формы выполняется её компиляция и размещение в памяти, после чего выполняется тело модуля. Пока форма открыта (размещена в памяти) - из элементов её диалога доступны процедуры и функции модуля - это вопросов и стремлений что-то "побороть" не вызывает, верно?.. так вот, для "дочерних окон" - в частности, для окон с выведенными в них таблицами - механизм полностью аналогичен. Или более аккуратно сформулировать если, то вот:
Для таблиц, сформированных (и показанных) из модуля открытого экземпляра формы (любой!), предопределенные процедуры (в частности ОбработкаЯчейкиТаблицы) выполняется в контексте открытого экземпляра формы (из модуля этой формы) пока этот экземпляр формы открыт; иначе выполняются предопределенные процедуры (в частности ОбработкаЯчейкиТаблицы) Глобального Модуля.
И - извиниТЕ, но и для "встроенных" (включенных в метаданные) отчетов и обработок - это правило точно так же действует, т.е. если форму, из которой сформирована таблица, закрыть - предопределенная процедура ОбработкаЯчейкиТаблицы будет вызываться из глобального модуля (который компилируется и размещается в памяти во время загрузки конфигурации и "живет вечно" в рамках сеанса работы). так что это Вы, похоже, ошиблись просто.
Так, на всякий случай. Уже давно перестал ругаться матом, когда бухгалтера рассказывают, как им удобно работать с базой прямо на флешке. Уже давно перестал проникаться жалостью к бухгалтерам, рыдающим вот-такенными слезами после известия о том, что им было объяснено про недопустимость такой работы из-за быстрого достижения допустимого для флешки количества циклов перезаписи, и в связи с игнорированием такого замечания - невосстановимости (как минимум - частичной, но всегда невозвратной) данных с посыпавшейся флешки. Все это перестал делать чуть позже после того, как перестал проникаться уважением к умственным способностям ответственных за эксплуатацию баз данных айтишников (вкупе с программистами-одинэсниками), которые не делают регулярных бэкапов. Вот теперь думаю - грех ли это?..
п.1 - не баг. всё вычисляется корректно - в соответствии со схемой запроса и обработкой его результатов. в баг это превращается при отсутствии понимания того, как работает запрос (в данном случае - при включении записей запроса, относящихся к группировке по строкам (или реквизитам строк), в состав группирующих записей по реквизитам шапки или документам). ошибка, свойственная не только запросам по документам, кстати.
п.2 - парафраз штатной документации ("описание встроенного языка", гл.12 - "Поиск зависит от выбранного в конфигураторе способа уникальности номеров (по месяцу, году и др.).").
п.3 - "описание встроенного языка", гл.33: "не следует прерывать последовательность просмотра временного набора данных (например, оператором Прервать;), если вы собираетесь использовать временный набор дальше или еще раз, т. к. в таком случае теряется точка позиционирования во временном наборе и продолжать просмотр невозможно" (в выводах к примеру в самом начале главы - кстати, пример сам по себе очень(!) полезен для понимания того, как работает запрос и обход его результатов).
Дополнение списочка. Особенность, в принципе понятная человеку, имеющему представление о том, как работает SQL-запрос (например). Но в связи с неочевидностью такой особенности, а также с отсутствием её описания в штатной (да и в нештатной тоже)) документации - вполне достойна описания в "багах". Так что - рекомендую: В случае, когда обход группировки по элементам (многоуровневого) справочника позиционируется на группе - обход следующих по вложенности группировок НЕ выполняется. Единственный способ обойти эту особенность (например, получить все-таки список документов, двигавших регистр по всем входящим в группу справочника позициям) - это "спустить" группировку по справочнику на самый нижний (самый вложенный) уровень. Неочевидность подобных "плясок с бубном", а также невозможность такими "плясками" решить проблему в некоторых случаях (например, наличие в запросе более одной группировки по многоуровневым справочникам с необходимостью получения для групп таких справочников развернутых в разрезе других группировок данных) делает такую "особенность" вполне достойной для описания в качестве именно "бага".
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!