Конфигуратор, помогите с написанием кода на сортировку документов по определенным реквизит

Новая тема
Показывать по 10 20 40 сообщений
> я картинку посмотрел, примерно понял о чем вопрос. может поэтому неверно?

блин раза три все перепроверял и не замечал
спс, все терь заработало, с меня пиво)))
"Да я все равно не пью уж года 4 :)
А ошибка типовая. Я тоже так ошибаюсь, скопировал, вставил, подправил и... что то забыл. И 1С так ошибается тоже. Вот смотрите, пара примеров. Заодно поможем тем, у кого эти грабли высокочат, ну и для 1С на заметку, судя по всему они тут все таки бывают.

Комплексная 7.70.493 (последняя на текущий момент).
Отчет.ПодготовкаСведенийДляИМНС, примерное место - строка 2120
Имеем два одинаковых блока алгоритма, очевидно второй был просто скопирован с первого и подправлен:
//имущественные вычеты на которые сотрудник имел право
ОписаниеВычета311=ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы+ПоследнийМесяц-1,3).ПолучитьЗначение(5);
Если ТипЗначенияСтр(ОписаниеВычета311)="СписокЗначений" Тогда
    ВсегоСуммаВычета311 = ОписаниеВычета311.ПолучитьЗначение(3);
    НомерУведомления    = ОписаниеВычета311.ПолучитьЗначение(4);
    ДатаУведомления     = Формат(ОписаниеВычета311.ПолучитьЗначение(5), "ДДДММГГГГ");
    КодФНСУведомления   = ОписаниеВычета311.ПолучитьЗначение(6);
КонецЕсли;

ОписаниеВычета312=ДоходыВычетыНалогиСотрудников.ПолучитьЗначение(СтрокаИтоговойТаблицы+ПоследнийМесяц-1,3).ПолучитьЗначение(6);
Если ТипЗначенияСтр(ОписаниеВычета312)="СписокЗначений" Тогда
    ВсегоСуммаВычета312 = ОписаниеВычета312.ПолучитьЗначение(3);
    НомерУведомления    = ?(ПустоеЗначение(НомерУведомления)=1,ОписаниеВычета312.ПолучитьЗначение(4),НомерУведомления);
    ДатаУведомления     = ?(ПустоеЗначение(ДатаУведомления)=1,Формат(ОписаниеВычета311.ПолучитьЗначение(5), "ДДДММГГГГ"),ДатаУведомления);
    КодФНСУведомления   = ?(ПустоеЗначение(КодФНСУведомления)=1,ОписаниеВычета312.ПолучитьЗначение(6),КодФНСУведомления);
КонецЕсли;

Ошибка во втором блоке в строке ДатаУведомления= ..., при внимательном рассмотрении в самом деле видно, что это ошибка. Там должно быть написано "ОписаниеВычета312", а не "ОписаниеВычета311".

Ну и второй пример.
Та же конфигурация.
Обработка.РасчетЕСН. Таблица "13н_Раздел2". Колонка 36, строка 195. Ну, или относительно состава печатной формы, это строка "0600" в разделе 00002 и колонка "ТФОМС".
Имеем там в ячейке формулу:
Формат(ИтоговаяТаблица.ПолучитьЗначение(4,"Строка06ТФОМС")-ИтоговаяТаблица.ПолучитьЗначение(1,"Строка06ТФОМС"),"Ч-15."+Точность)
А она неправильная! Должна быть такая:
Формат(ИтоговаяТаблица.ПолучитьЗначение(4,"Строка06ТФОМС"),"Ч-15."+Точность)

Почему? А посмотрите соседние ячейки с этой и уловите логику. Очевидно, формула была тоже просто скопирована вместе с областью таблицы с другого места (с "0610" строки). Соседние подправили, а эту нет.

Беда в том что, когда пробуешь сказать об ошибках в hotline, они просят пример, на котором видно, где ошибка проявляется. Поэтому я давно уже не пишу туда, много времени нужно для этого.

Ну и еще одна "беда" вдогонку. Если у нас в комплексной ведется учет более чем одного собственного юрлица, то в справочнике юрлиц имеем несколько элементов. Теперь смотрим в глобальный модуль:
Функция глВеличинаПроцентаСтавкиЕСН(ЮрЛицо, Код, ДатаАктуальности)
    СпрСтавкиЕСН = СоздатьОбъект("Справочник.СтавкиЕСН");
    СпрСтавкиЕСН.ИспользоватьВладельца(ЮрЛицо);
    Если СпрСтавкиЕСН.НайтиПоКоду(Код,0) = 1 Тогда
         Возврат СпрСтавкиЕСН.Процент.Получить(ДатаАктуальности)
    КонецЕсли;
    Возврат 0
КонецФункции

Ошибка в "СпрСтавкиЕСН.НайтиПоКоду(Код,0)". Почему 0 то? Зачем вообще тогда было писать ИспользоватьВладельца(...), если поиск идет "по всему справочнику"? Что имеем в результате ошибки? А вот что. При аргументе ФлагПоиска=0 будет найден первый подходящий элемент справочника такой, который соответствует режиму упорядочивания элементов. То есть, практически, результат данного поиска зависит от того, в каком порядке отсортированы по наименованию элементы в справочнике. И мы получим вовсе не информацию о том есть у нас у юрлица ЕСН или нет, а просто какое то значение, с нужным нам юрлицом никак и не связанное. В итоге больничные листы могут при проведении в журнал документов записать либо кучу ненужных записей про особые режимы, либо не сделать этого в том случае когда это надо.
И вообще, по изменениям в этом релизе относительно больничных проблема, мне уже "телефон оборвали", завтра пойду разбираться что там за чудеса. Пример: в ЖР текущий период "январь 2010". Делаем БЛ за 20-25 декабря 2009 г., имеем удвоенное количество строк в таблице о среднем заработке и удвоенный результат по расчету больничного листа. Бегло глянул, вроде бы насчет таблицы среднего - не факт что это ошибка, но результат не может быть выше в 2 раза. Завтра разберусь, в общем, напишу если что"
"самое досадное, что в синтаксической ошибки то не выдает когда строка скопировано, в моём случае потому что такая процедура существует, а то что выбор значения не соответствует процедуре программа не обнаруживает
стати была еще одна ошибка незначительная сюда там вставил же не весь модуль, синтаксис Если ...Иначе...тогда ... конец если. первое стоит в но чале а последние спустя пару страниц ниже :)))


>Процедура ПриОткрытииИЛИПереоткрытииЖурнала(Режим)
вариант1
>ИначеЕсли ОтборПо  = "по кассе" Тогда                      
>КассаДляОтбора = ТекДок.Касса;  // общий реквизит документов

Вариант2
>ИначеЕсли ОтборПо  = "по кассе" Тогда                      
>Если глЕстьРеквизитШапки("Касса", ТекДок.Вид()) = 1 Тогда
>КассаДляОтбора = ТекДок.Касса;  // общий реквизит документов      
>Иначе                                                          
>ВидОтбора.ТекущаяСтрока(1); // снимаем быстрый отбор        
>КонецЕсли;    




не совсем понял разницу,
Проблема №1
у меня в обоих случаях при открытие постое значение(при выборе отбора "по кассе")
>Процедура ПриЗакрытии()
>Если ПустоеЗначение(ДокументОснованиеЖурнала) = 1  Тогда
>СохранитьЗначение("КассаДляОтбораЖурнала",КассаДляОтбора);
>КонецЕсли

проблема №2
перебросил это в рабочею базу
тоже Т+С 9.2, но там при смене отбора(не закрывая Общего журнала) слетает значения выбора на 0
это опять я что то не доглядел?))))

"
"> у меня в обоих случаях при открытие постое значение
Видимо, эта подзадача решается наличием строк:

Процедура ПриУстановкеБыстрогоОтбора()
...
    Если ОтборПо = "по контрагенту" Тогда
         ...
    ИначеЕсли ОтборПо = "по виду документов" Тогда
         ...
    ИначеЕсли ОтборПо = "по кассе" Тогда  //в конце вставляем это
         ПриВыбореКассы();
         ЗначениеВВидеСтроки=Строка(КассаДляОтбора);
    КонецЕсли;
....

> но там при смене отбора(не закрывая Общего журнала) слетает значения выбора на 0
ну так надо смотреть что там система делает при смене отбора. И находится это все как раз в привеженной выше ПриУстановкеБыстрогоОтбора()

смотрите внимательно процедуру эту."
"Ты не совсем правильно меня понял, чего чего а синтаксис Если я помню еще с бэйсика
и вопрос был в чем разница этих двух процедур


по поводу ошибки она была в
> КассаДляОтбора =ВосстановитьЗначение("КассаДляОтбораЖурнала");  


впрос по синтаксису

> ВидДокументаДляОтбора= ?(ПустоеЗначение(ВидДокументаДляОтбора)=1, 1, ВидДокументаДляОтбора);
то что перечисляется через запетую как я понял это перечисления возможных вариантов значения
что значит просто "1"? во всех остальных там стоит
> ПолучитьПустоеЗначение("Справочник.Кассы")"
А, ясно...
В VB тоже есть такая функция: http://msdn.microsoft.com/ru-ru/library/27ydhh0d.aspx

Ну
и в описание языка 1С смотрите:
?(,,)
Синтаксис:
?(,,)
Назначение:
Возвращает значение первого выражения, если условие истинно, иначе - значение второго выражения.
результат вычисления условного выражения.
Параметры:
- логическое выражение,
- выражение,
- выражение.

А про "1" - это номер, соответствующий элементу списка СписокВидовДокументов, по которому нужно выполнить отбор в журнале, если ВидДокументаДляОтбора пуст. То есть, придумано для вот чего. Ситуация:
1. Пользователь никогда ранее не пользовался этим механизмом отбора, поэтому ранее сохраненного значения вида документов для отбора для него нет.
2. Пользователь тычет в "установить отбор по виду документов". По какому виду по умолчанию нужно тут же включить отбор, если ранее этого не делалось? Ну по первому в списке просто и все. Этим и занимается алгоритм
Спасибо за эти примеры. Меня тут попросили прийти и обновить комплексную - буду на месте править ошибки :)
У меня их больше, но я пока не могу обобщить и все выложить. В связи с последними веяниями в законодательстве работы много
"> Ну и в описание языка 1С смотрите:
> ?(,,)
> Синтаксис:
> ?(,,)
> Назначение:
> Возвращает значение первого выражения, если условие истинно, иначе - значение второго выражения.
> результат вычисления условного выражения.
> Параметры:
>  - логическое выражение,
>  - выражение,
>  - выражение.
>
> А про "1" - это номер, соответствующий элементу списка СписокВидовДокументов, по которому нужно выполнить отбор в журнале, если ВидДокументаДляОтбора пуст. То есть, придумано для вот чего. Ситуация:
> 1. Пользователь никогда ранее не пользовался этим механизмом отбора, поэтому ранее сохраненного значения вида документов для отбора для него нет.
> 2. Пользователь тычет в "установить отбор по виду документов". По какому виду по умолчанию нужно тут же включить отбор, если ранее этого не делалось? Ну по первому в списке просто и все. Этим и занимается алгоритм

ну рассмотрем другой пример синтаксиса

> СписокВидовДокументов.ВыбратьЗначение(ВыбЗначение,"Выбор вида документов",,60,0);

выбрать значение, а именно  "выбор вида документа", " " (хз что за пробел, свобода выбора наверно), "60" занчение вот только чего?, "0" невыбранно нечего
извиняюсь за каламбур я ток учусь))), щас пытаюсь понять как сделать так что бы
> Процедура ПоКнопкеЗначение()
выбор перемещался не в первую строку а в ранние выбранную
помойму это
> Если ПустоеЗначение(ВидДокументаДляОтбора)>0 Тогда
> ВыбЗначение = """";
если значение отлично от 0, то выбрать значение """",  как я понял которое ранние установлено?


"
Как в отладчике сделать чтобы на каждой строчке выбранного модуля была точка остановки? это  вручную все расставлять долго
Читают тему
(гостей: 1)

Быстрый переход