Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Войти | Зарегистрироваться )



История благодарностей участнику Cthulhu ::: Спасибо сказали: 83 раз
Дата поста: В теме: За сообщение: Спасибо сказали:
03.10.12, 11:12 Получить значение реквизита из ДокументаОснования
Цитата(ZhenyaYa @ 02.10.12, 21:41) *
Ну начнем с того что в первом примере я работаю не с табличной частью! То есть ничего позиционировать не нужно, но все равно не работает!

практика недвусмысленно свидетельствует о том, что в подобных случаях "ну начинать" лучше всего с отладчика.
например, поставить точку прерывания на операторе присвоения (в стартовом коде - на строке с "ЗаголовокП=ДокументОснование.ЗаголовокПФ;").
когда выполнение дойдет до точки останова - открыть табло (кнопка панели инструментов "открыть табло" или меню-Отладка-Табло), и в нем посмотреть значения (набрать вычисляемые выражения построчно), например такие:
Метаданные.Документ(ДокументОснование.Вид()).РеквизитШапки("ЗаголовокПФ").Выбран()
Метаданные.Документ(ДокументОснование.Вид()).РеквизитТабоичнойЧасти("ЗаголовокПФ").Выбран()
ТипЗначенияСтр(ДокументОснование.ЗаголовокПФ)
ДокументОснование.ЗаголовокПФ
// и т.п.

возможно что-то прояснится?..

прим.: я надеюсь, что ЗаголовокП - это все-таки переменная? описано через "Перем"? а то если реквизит - то при несовпадении типов/видов вполне себе может ничего не присвоить.
ZhenyaYa,
02.10.12, 21:15 Получить значение реквизита из ДокументаОснования
баттюшки-светы ужас то какой!
так ведь для получения реквизита таб.части - надо сначала спозиционироваться на строке, из которой этот реквизит надо дёрнуть.
в данном случае - спозиционироваться на той строке документа (ДокументОснование=ТекущийДок.СсылкаНаДокОсн;), по которой был свформирован (ТекущийДок). например, прямым перебором с проверкой некоего условия (соответствия строки таб.части) с прерыванием, типа
ДокументОснование.ВыбратьСтроки(); Пока ДокументОснование.ПолучитьСтроку()<>0
Цикл Если <По этой строке сформирован ТекущийДок> Тогда Прервать КонецЕсли КонецЦикла;
// и вот тут ЗаголовокП=ДокументОснование.ЗаголовокПФ; вернет вожделенное значение
ZhenyaYa,
28.09.12, 23:02 Автонумерация в справочнике
Цитата(Ardi @ 28.09.12, 21:16) *
И тогда нельзя будет искать товар по уникальному коду

уникальность в пределах подчинения дает уникальный полный код, по которому тоже можно искать. ну да не суть. в сторону такой структуры нумерации, как выше сказано можно использовать "УстановитьНовыйКод(СтрЗаменить(Родитель.ПолныйКод(),"/",""))", например, в ПриЗаписи
прим.: при переносе из группы в группу тоже.
Ardi, mavrik,
18.09.12, 19:09 Корисні прийоми при розв'язанні задач
Цитата(mister-x @ 18.09.12, 16:53) *
Цікавить така річ: нехай на довільній формі (обробка, звіт) є N реквізитів, індентифікатор яких "рекв1", "рекв2"..."реквN". Як їм автоматично в циклі присвоїти значення? Така річ як Форма.ПолучитьАтрибут(ИмяРеквизита) викор. успішно для встановлення в циклі видимості, доступності реквізиту; от присвоїти значення не вийде. Чи можливо це зробити стандартними можливостями 1С?

Потом смотрим в "описание встроенного языка", глава "процедуры и функции форматирования" - а именно на описание функции "Шаблон". И внезапно ловим озарение - обана, да ведь там в параметре можно любое выражение всунуть - в том числе вызов функции, которая как-то изменяет свои параметры!!!
Под действием озарения и в продолжение его пишем (лучше сразу в ГМ) вот такую, например, полезную функцию:
Функция глПрисвоитьЗначение(Знач парИсточник,парПриемник="") Экспорт
    Перем тТип;
    тТип=ТипЗначенияСтр(парИсточник);
    Если Прав(тТип,8)="Значений" Тогда
        парПриемник=СоздатьОбъект(тТип); парИсточник.Выгрузить(парПриемник);
    ИначеЕсли тТип="Справочник" Тогда
        парПриемник=парИсточник.ТекущийЭлемент();
    ИначеЕсли тТип="Документ" Тогда
        парПриемник=парИсточник.ТекущийДокумент();
    ИначеЕсли тТип="Счет" Тогда
        парПриемник=парИсточник.ТекущийСчет();
    Иначе
        парПриемник=парИсточник;
    КонецЕсли;
    Возврат(парИсточник);
КонецФункции //глПрисвоитьЗначение

А в модуле формы, где нам надо присвоить реквизиту(!)формы с именем, ну, допустим, "Фигня1" значение, хранящееся в переменной, ну, допустим, "ЗначениеДляФигни1", озаренные такие, смело пишем:
Шаблон("[глПрисвоитьЗначение(ЗначениеДляФигни1,Фигня1)]");

Кстати, эта "задняя дверь" сильно не нравится самой фирме 1С. Настолько не нравится, что использование функции "Шаблон" для чего-либо кроме форматирования в любой конфигурации - практически крест на возможности сделать её "1с-совместимо".
Flexy, mister-x, Домовик, Читатель,
18.09.12, 18:51 Отчет по всем счетам и всем субконто развернуто
// Модуль Формы внешней обработки
//    На Форме должны наличествовать:
//        - ТаблицаЗначений с наименованием ПечТЗ;
//        - Кнопка с формулой "Сформировать()" (без кавычек)

Перем МаксКвоСубконто,тхтКолСубконто, СумДлина,СумТочн,СумФрмт,ВалСумДлина,ВалСумТочн,ВалСумФрмт;

//==============================================================================
Процедура ДобавитьСтрокуДанныхПоТекРазвороту(тБухИт,тПечТЗ,тКвоСубконто,тВалюта="")
    тПечТЗ.НоваяСтрока(); тПечТЗ.ПолучитьСтрокуПоНомеру(тПечТЗ.КоличествоСтрок());
    тПечТЗ.Счет=тБухит.Счет; Для СчСубконто=1 По тКвоСубконто
    Цикл тПечТЗ.УстановитьЗначение(тПечТЗ.НомерСтроки,"Субконто"+СчСубконто,тБухИт.Субконто(СчСубконто)) КонецЦикла;
    тПечТЗ.СуммаДт=тБухит.СКД("С"); тПечТЗ.СуммаКт=тБухит.СКК("С");
    тПечТЗ.Валюта=тВалюта; Если ПустоеЗначение(тВалюта)<>1
    Тогда тПечТЗ.ВалСуммаДт=тБухИт.СКД("В"); тПечТЗ.ВалСуммаКт=тБухИт.СКК("В"); КонецЕсли;
КонецПроцедуры //ДобавитьСтрокуДанныхПоТекРазвороту
//------------------------------------------------------------------------------
Процедура ДоРазвернутьПоСубконто(тБухит,тКвоСубконто,тПечТЗ,ТекВыбСубконто=1)
    Если ТекВыбСубконто<=тКвоСубконто Тогда
        тБухит.ВыбратьСубконто(); Пока тБухит.ПолучитьСубконто()<>0
        Цикл ДоРазвернутьПоСубконто(тБухит,тКвоСубконто,тПечТЗ,ТекВыбСубконто+1) КонецЦикла;
    ИначеЕсли тБухИт.Счет.Валютный<>0 Тогда
        тБухит.ВыбратьВалюты(); Пока тБухит.ПолучитьВалюту()<>0
        Цикл ДобавитьСтрокуДанныхПоТекРазвороту(тБухИт,тПечТЗ,тКвоСубконто,тБухИт.Валюта) КонецЦикла;
    Иначе ДобавитьСтрокуДанныхПоТекРазвороту(тБухИт,тПечТЗ,тКвоСубконто) КонецЕсли;
КонецПроцедуры //ДоРазвернутьПоСубконто
//------------------------------------------------------------------------------
Процедура Сформировать()
    Перем тБухИт,счСубконто;
    тБухит=СоздатьОбъект("БухгалтерскиеИтоги");
    Для счСубконто=1 По МаксКвоСубконто Цикл тБухИт.ИспользоватьСубконто(,,1,0) КонецЦикла;
    тБухит.ВключатьСубсчета(-1); тБухит.ВыполнитьЗапрос(,ВыбДата,,,,"СВ",,3);
    тБухИт.ВыбратьСчета(); Пока тБухИт.ПолучитьСчет()<>0
    Цикл ДоРазвернутьПоСубконто(тБухИт,тБухит.Счет.КоличествоСубконто(),ПечТЗ) КонецЦикла;
    Если ПечТЗ.КоличествоСтрок()<>0 Тогда
        ПечТЗ.Сортировать("+Счет,"+тхтКолСубконто,1); ПечТЗ.ТекущаяСтрока(1);
    КонецЕсли;
КонецПроцедуры //Сформировать
//==============================================================================

ВалСумДлина=Метаданные.ДлинаВалютнойСуммыПроводки; ВалСумТочн=Метаданные.ТочностьВалютнойСуммыПроводки;
Валфрмт="Ч"+ВалСумДлина+"."+ВалСумТочн+", ";

СумДлина=Метаданные.ДлинаСуммыПроводки; СумТочн=Метаданные.ТочностьСуммыПроводки;
СумФрмт="Ч"+СумДлина+"."+СумТочн+", ";

ПечТЗ.Очистить();
ПечТЗ.НоваяКолонка("Счет","Счет",,,"Счет",7);
тхтКолСубконто=""; Для МаксКвоСубконто=1 По Метаданные.МаксимальноеКоличествоСубконто Цикл
    тхтКолСубконто=тхтКолСубконто+"Субконто"+МаксКвоСубконто+",";
    ПечТЗ.НоваяКолонка("Субконто"+МаксКвоСубконто,,,,"Субконто#"+МаксКвоСубконто,31);
КонецЦикла; МаксКвоСубконто=МаксКвоСубконто-1;
ПечТЗ.НоваяКолонка("СуммаДт","Число",СумДлина,СумТочн,"Дт-Сальдо",СумДлина+1,СумФрмт,2);
ПечТЗ.НоваяКолонка("СуммаКт","Число",СумДлина,СумТочн,"Кт-Сальдо",СумДлина+1,СумФрмт,2);
ПечТЗ.НоваяКолонка("Валюта","Справочник.Валюты",,,"в Вал.",12);
ПечТЗ.НоваяКолонка("ВалСуммаДт","Число",ВалСумДлина,ВалСумТочн,"=Дт-Сальдо",ВалСумДлина,ВалСумФрмт,2);
ПечТЗ.НоваяКолонка("ВалСуммаКт","Число",ВалСумДлина,ВалСумТочн,"=Кт-Сальдо",ВалСумДлина,ВалСумФрмт,2);
тхтКолСубконто=Лев(тхтКолСубконто,СтрДлина(тхтКолСубконто)-1);


навскидку, в ожидании такси.. smile.gif
прим: дальше что надо - разобраться нетрудно, я надеюсь?..
awp, vadim007,
17.09.12, 14:19 Корисні прийоми при розв'язанні задач
Возможность проверки изменений Документа, записанного в реквизит типа Документ, с момента открытия формы (объекта) с таким реквизитом.
<НаименованиеРеквизитаСДокументом>.<МетодыПолученияДанныхИлиПростоСсылкиНаРеквизиты> - дадут те значения, которые были в этом документе на момент откытия формы (объекта?) с таким реквизитом;
ВремДок=<НаименованиеРеквизитаСДокументом>.ТекущийДокумент();
ВремДок.<МетодыПолученияДанныхИлиПростоСсылкиНаРеквизиты> - дадут актуальные данные из этого документа (на момент выполнения кода).
Иногда бывает полезным, напримерЮ, при проверке в ПриЗаписи подчиненного документа - а не был ли кем-то вдруг как-то изменен ДокументОснование?.. Хотя и не только для этого.
(да, парадоксально, но факт - если знать, что при открытии формы движок 1с кэширует все объекты данных агрегатных типов, ссылки на которые есть в открываемой форме)

ЗЫ: там лишняя точка, клипборд ей в печенку...
mister-x, Читатель,
15.09.12, 19:56 Корисні прийоми при розв'язанні задач
Ускорение получения остатков по "неполным" разрезам измерений с методом "ПолучитьСводныйОстаток". В 1с к регистрам (как правило) строятся индексы, которые составляются из значений измерений, идущих в порядке их следования в метаданных. при этом, если в списке измерений при использовании подобного метода измерения идут с самого начала списка парамептров без "пропусков" - то движок 1с для получения этих данных использует указанные индексы; если жде в списке фильтра по измерениям встречается пропуск измерения - а это бывает нужно, если нужен итог по всем значениям такого измерения сводно, без фильтации - то для получения итогов используется простой перебор(!) таблицы итогов. Поэтому в случаях, когда это возможно, вместо получения сводного остатка с пропуском значений измерений бывает оптимальнее совершать вместо одного запроса с пропуском несколько запросов без пропусков, с подстановкой в это реквизит всех возможных значений и подсуммированием.
Alex729, mister-x, XBrut,
14.09.12, 13:25 Корисні прийоми при розв'язанні задач
Использование в измерениях регистров / видах субконто агрегатных типов данных (Документ,Справочник) с не указанным явно видом.
В модулях проведения документов типовых конфигураций как правило стоит "присвоение в лоб" значения субконто/измерения из реквизита документа. При этом реквизит документа может быть пустым(!!!!) Документом/Справочником определенного(!!!!) вида.
В результате такой безалаберности могут копиться итоги с НЕСКОЛЬКИМИ ПУСТЫМИ значениями СУБКОНТО/ИЗМЕРЕНий. Особенно феерично это выглядит, например, когда в ОСВ "откуда ни возьмись" болтаются несколько сальдо/оборотов по совершенно "одинаковым" пустым значениям субконто.
С некоторых пор лично я для избегания такой ситуации сразу перелопачиваю модули проведения документов: прямые присвоения значений субконто-измерениям "обрамляю" в если-проверку этих значений на непустое значение (если таки там это значение пустое - лучше вообще не присваивать значение субконто/измерению, это гарантирует отсутствие "расползания" итогов/оборотов по нескольки "одинаковым, но все-таки разным" пустым значениям субконто/измерений, и кроме того, упрощает последующий доступ к итогам/оборотам по именно пустым значениям субконто/измерений в случае необходимости).
Alex729, andreykyiv@bigmir.net, mister-x, XBrut, Читатель,
14.09.12, 10:05 как определить что объект заблокирован
Навскидку.

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: вместо реквизита можно использовать справочник (можно динамичесский).
nysysimara,
27.08.12, 17:43 Баги чи недокументовані особливості (ньюанси) роботи із платформою
vadim007
Это не баг, скорее недокументированная особенность. При открытии формы выполняется её компиляция и размещение в памяти, после чего выполняется тело модуля. Пока форма открыта (размещена в памяти) - из элементов её диалога доступны процедуры и функции модуля - это вопросов и стремлений что-то "побороть" не вызывает, верно?.. так вот, для "дочерних окон" - в частности, для окон с выведенными в них таблицами - механизм полностью аналогичен. Или более аккуратно сформулировать если, то вот:

Для таблиц, сформированных (и показанных) из модуля открытого экземпляра формы (любой!), предопределенные процедуры (в частности ОбработкаЯчейкиТаблицы) выполняется в контексте открытого экземпляра формы (из модуля этой формы) пока этот экземпляр формы открыт; иначе выполняются предопределенные процедуры (в частности ОбработкаЯчейкиТаблицы) Глобального Модуля.

И - извиниТЕ, но и для "встроенных" (включенных в метаданные) отчетов и обработок - это правило точно так же действует, т.е. если форму, из которой сформирована таблица, закрыть - предопределенная процедура ОбработкаЯчейкиТаблицы будет вызываться из глобального модуля (который компилируется и размещается в памяти во время загрузки конфигурации и "живет вечно" в рамках сеанса работы). так что это Вы, похоже, ошиблись просто.
vadim007,
23.08.12, 12:28 1С Выдал ошибку runtime library. Помогите решить!
Так, на всякий случай.
Уже давно перестал ругаться матом, когда бухгалтера рассказывают, как им удобно работать с базой прямо на флешке.
Уже давно перестал проникаться жалостью к бухгалтерам, рыдающим вот-такенными слезами после известия о том, что им было объяснено про недопустимость такой работы из-за быстрого достижения допустимого для флешки количества циклов перезаписи, и в связи с игнорированием такого замечания - невосстановимости (как минимум - частичной, но всегда невозвратной) данных с посыпавшейся флешки.
Все это перестал делать чуть позже после того, как перестал проникаться уважением к умственным способностям ответственных за эксплуатацию баз данных айтишников (вкупе с программистами-одинэсниками), которые не делают регулярных бэкапов.
Вот теперь думаю - грех ли это?..
DartRomanius,
17.08.12, 15:49 Баги чи недокументовані особливості (ньюанси) роботи із платформою
п.1 - не баг. всё вычисляется корректно - в соответствии со схемой запроса и обработкой его результатов. в баг это превращается при отсутствии понимания того, как работает запрос (в данном случае - при включении записей запроса, относящихся к группировке по строкам (или реквизитам строк), в состав группирующих записей по реквизитам шапки или документам). ошибка, свойственная не только запросам по документам, кстати.

п.2 - парафраз штатной документации ("описание встроенного языка", гл.12 - "Поиск зависит от выбранного в конфигураторе способа уникальности номеров (по месяцу, году и др.).").

п.3 - "описание встроенного языка", гл.33: "не следует прерывать последовательность просмотра временного набора данных (например, оператором Прервать;), если вы собираетесь использовать временный набор дальше или еще раз, т. к. в таком случае теряется точка позиционирования во временном наборе и продолжать просмотр невозможно" (в выводах к примеру в самом начале главы - кстати, пример сам по себе очень(!) полезен для понимания того, как работает запрос и обход его результатов).

Дополнение списочка. Особенность, в принципе понятная человеку, имеющему представление о том, как работает SQL-запрос (например). Но в связи с неочевидностью такой особенности, а также с отсутствием её описания в штатной (да и в нештатной тоже)) документации - вполне достойна описания в "багах". Так что - рекомендую:
В случае, когда обход группировки по элементам (многоуровневого) справочника позиционируется на группе - обход следующих по вложенности группировок НЕ выполняется.
Единственный способ обойти эту особенность (например, получить все-таки список документов, двигавших регистр по всем входящим в группу справочника позициям) - это "спустить" группировку по справочнику на самый нижний (самый вложенный) уровень. Неочевидность подобных "плясок с бубном", а также невозможность такими "плясками" решить проблему в некоторых случаях (например, наличие в запросе более одной группировки по многоуровневым справочникам с необходимостью получения для групп таких справочников развернутых в разрезе других группировок данных) делает такую "особенность" вполне достойной для описания в качестве именно "бага".
mister-x, Petre,

3 страниц V  < 1 2 3
RSS Текстовая версия Сейчас: 27.04.24, 17:11
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!