Использование в измерениях регистров / видах субконто агрегатных типов данных (Документ,Справочник) с не указанным явно видом.
В модулях проведения документов типовых конфигураций как правило стоит "присвоение в лоб" значения субконто/измерения из реквизита документа. При этом реквизит документа может быть пустым(!!!!) Документом/Справочником определенного(!!!!) вида.
В результате такой безалаберности могут копиться итоги с НЕСКОЛЬКИМИ ПУСТЫМИ значениями СУБКОНТО/ИЗМЕРЕНий. Особенно феерично это выглядит, например, когда в ОСВ "откуда ни возьмись" болтаются несколько сальдо/оборотов по совершенно "одинаковым" пустым значениям субконто.
С некоторых пор лично я для избегания такой ситуации сразу перелопачиваю модули проведения документов: прямые присвоения значений субконто-измерениям "обрамляю" в если-проверку этих значений на непустое значение (если таки там это значение пустое - лучше вообще не присваивать значение субконто/измерению, это гарантирует отсутствие "расползания" итогов/оборотов по нескольки "одинаковым, но все-таки разным" пустым значениям субконто/измерений, и кроме того, упрощает последующий доступ к итогам/оборотам по именно пустым значениям субконто/измерений в случае необходимости).
Ускорение получения остатков по "неполным" разрезам измерений с методом "ПолучитьСводныйОстаток". В 1с к регистрам (как правило) строятся индексы, которые составляются из значений измерений, идущих в порядке их следования в метаданных. при этом, если в списке измерений при использовании подобного метода измерения идут с самого начала списка парамептров без "пропусков" - то движок 1с для получения этих данных использует указанные индексы; если жде в списке фильтра по измерениям встречается пропуск измерения - а это бывает нужно, если нужен итог по всем значениям такого измерения сводно, без фильтации - то для получения итогов используется простой перебор(!) таблицы итогов. Поэтому в случаях, когда это возможно, вместо получения сводного остатка с пропуском значений измерений бывает оптимальнее совершать вместо одного запроса с пропуском несколько запросов без пропусков, с подстановкой в это реквизит всех возможных значений и подсуммированием.
Возможность проверки изменений Документа, записанного в реквизит типа Документ, с момента открытия формы (объекта) с таким реквизитом.
<НаименованиеРеквизитаСДокументом>.<МетодыПолученияДанныхИлиПростоСсылкиНаРеквизиты> - дадут те значения, которые были в этом документе на момент откытия формы (объекта?) с таким реквизитом;
ВремДок=<НаименованиеРеквизитаСДокументом>.ТекущийДокумент();
ВремДок.<МетодыПолученияДанныхИлиПростоСсылкиНаРеквизиты> - дадут актуальные данные из этого документа (на момент выполнения кода).
Иногда бывает полезным, напримерЮ, при проверке в ПриЗаписи подчиненного документа - а не был ли кем-то вдруг как-то изменен ДокументОснование?.. Хотя и не только для этого.
(да, парадоксально, но факт - если знать, что при открытии формы движок 1с кэширует все объекты данных агрегатных типов, ссылки на которые есть в открываемой форме)
ЗЫ: там лишняя точка, клипборд ей в печенку...
Цікавить така річ: нехай на довільній формі (обробка, звіт) є N реквізитів, індентифікатор яких "рекв1", "рекв2"..."реквN". Як їм автоматично в циклі присвоїти значення? Така річ як Форма.ПолучитьАтрибут(ИмяРеквизита) викор. успішно для встановлення в циклі видимості, доступності реквізиту; от присвоїти значення не вийде. Чи можливо це зробити стандартними можливостями 1С? от тут http://pro1c.org.ua/index.php?showtopic=8336 і тут http://pro1c.org.ua/index.php?showtopic=2054&st=20 почали мову
Функция глПрисвоитьЗначение(Знач парИсточник,парПриемник="") Экспорт
Перем тТип;
тТип=ТипЗначенияСтр(парИсточник);
Если Прав(тТип,8)="Значений" Тогда
парПриемник=СоздатьОбъект(тТип); парИсточник.Выгрузить(парПриемник);
ИначеЕсли тТип="Справочник" Тогда
парПриемник=парИсточник.ТекущийЭлемент();
ИначеЕсли тТип="Документ" Тогда
парПриемник=парИсточник.ТекущийДокумент();
ИначеЕсли тТип="Счет" Тогда
парПриемник=парИсточник.ТекущийСчет();
Иначе
парПриемник=парИсточник;
КонецЕсли;
Возврат(парИсточник);
КонецФункции //глПрисвоитьЗначение
Шаблон("[глПрисвоитьЗначение(ЗначениеДляФигни1,Фигня1)]");
О кнопках выбора (в смысле "педалек" у реквизитов),
Все знают, что наличие таких педалек устанавливается в свойствах реквизита, на закладке "Дополнительно", галкой "Имеет кнопку выбора" (внизу-справа). У реквизитов т.н. агрегатного типа (Справочник,Документ, итп) эта педалька устанавливается движком автоматически (и не может быть снята) - но сейчас не об этом.
1. У реквизитов примитивных типов (в частности, у строк) эта педальта тоже может быть установлена. И тогда, например, можно в процедуре формы "ПриНачалеВыбораЗначения" нажатие на эту педальку поймать, и закодировать какой-нибудь процесс выбора значения с последующей установкой в реквизит значения, вычисленного по выполненному выбору. Если для выбора будет открыта какая-то форма (с помощью "ОткрытьФорму") - то она откроется в режиме выбора(!), а выбранное значение попадет в по окончании выбора в процедуру "ОбработкаВыбораЗначения" (в ее первый параметр), и в этой процедуре переменную, указанную в первом параметре, можно пере-назначить как будда на душу положит - если при этом не обнулять значение третьего параметра этой процедуры (т.н. "флаг стандартной обработки") - то в реквизит будет установлено именно вот таким образом "переиначенный" в этой процедуре первый параметрр (изначально содержащий выбранное значение)!
В качестве небезынтересного примера.
Создайте внешнюю обработку с единственным реквизитом "ВыбКонтрагентНаим" типа "строка неограниченной длины", добавьте в этот реквизит педальку (см.выше как). А в модуле - вот такой код:
Процедура ПриНачалеВыбораЗначения(НаимРекв,ФСО) //предопределенная
Если НаимРекв="ВыбКонтрагентНаим" Тогда
ОткрытьФорму("Справочник.Контрагенты");//ну или любой другой, который есть в конфигурации
КонецЕсли;
КонецПроцедуры //ПриНачалеВыбораЗначения
//------------------------------------------------------------------------------
Процедура ОбработкаВыбораЗначения(ВыбЗнач,НаимРекв,ФСО) //предопределенная
Если НаимРекв="ВыбКонтрагентНаим" Тогда
ВыбЗнач=ВыбЗнач.ПолноеНаименование();
КонецЕсли;
КонецПроцедуры //ОбработкаВыбораЗначения
//==============================================================================
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua