Конфигуратор, помогите с написанием кода на сортировку документов по определенным реквизит
15.01.2010
21:00
#11
> я картинку посмотрел, примерно понял о чем вопрос. может поэтому неверно?
блин раза три все перепроверял и не замечал
спс, все терь заработало, с меня пиво)))
блин раза три все перепроверял и не замечал
спс, все терь заработало, с меня пиво)))
17.01.2010
08:32
#12
"Да я все равно не пью уж года 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С так ошибается тоже. Вот смотрите, пара примеров. Заодно поможем тем, у кого эти грабли высокочат, ну и для 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 раза. Завтра разберусь, в общем, напишу если что"
17.01.2010
15:17
#13
"самое досадное, что в синтаксической ошибки то не выдает когда строка скопировано, в моём случае потому что такая процедура существует, а то что выбор значения не соответствует процедуре программа не обнаруживает
стати была еще одна ошибка незначительная сюда там вставил же не весь модуль, синтаксис Если ...Иначе...тогда ... конец если. первое стоит в но чале а последние спустя пару страниц ниже
))
>Процедура ПриОткрытииИЛИПереоткрытииЖурнала(Режим)
вариант1
>ИначеЕсли ОтборПо = "по кассе" Тогда
>КассаДляОтбора = ТекДок.Касса; // общий реквизит документов
Вариант2
>ИначеЕсли ОтборПо = "по кассе" Тогда
>Если глЕстьРеквизитШапки("Касса", ТекДок.Вид()) = 1 Тогда
>КассаДляОтбора = ТекДок.Касса; // общий реквизит документов
>Иначе
>ВидОтбора.ТекущаяСтрока(1); // снимаем быстрый отбор
>КонецЕсли;
не совсем понял разницу,
Проблема №1
у меня в обоих случаях при открытие постое значение(при выборе отбора "по кассе")
>Процедура ПриЗакрытии()
>Если ПустоеЗначение(ДокументОснованиеЖурнала) = 1 Тогда
>СохранитьЗначение("КассаДляОтбораЖурнала",КассаДляОтбора);
>КонецЕсли
проблема №2
перебросил это в рабочею базу
тоже Т+С 9.2, но там при смене отбора(не закрывая Общего журнала) слетает значения выбора на 0
это опять я что то не доглядел?))))
"
стати была еще одна ошибка незначительная сюда там вставил же не весь модуль, синтаксис Если ...Иначе...тогда ... конец если. первое стоит в но чале а последние спустя пару страниц ниже
>Процедура ПриОткрытииИЛИПереоткрытииЖурнала(Режим)
вариант1
>ИначеЕсли ОтборПо = "по кассе" Тогда
>КассаДляОтбора = ТекДок.Касса; // общий реквизит документов
Вариант2
>ИначеЕсли ОтборПо = "по кассе" Тогда
>Если глЕстьРеквизитШапки("Касса", ТекДок.Вид()) = 1 Тогда
>КассаДляОтбора = ТекДок.Касса; // общий реквизит документов
>Иначе
>ВидОтбора.ТекущаяСтрока(1); // снимаем быстрый отбор
>КонецЕсли;
не совсем понял разницу,
Проблема №1
у меня в обоих случаях при открытие постое значение(при выборе отбора "по кассе")
>Процедура ПриЗакрытии()
>Если ПустоеЗначение(ДокументОснованиеЖурнала) = 1 Тогда
>СохранитьЗначение("КассаДляОтбораЖурнала",КассаДляОтбора);
>КонецЕсли
проблема №2
перебросил это в рабочею базу
тоже Т+С 9.2, но там при смене отбора(не закрывая Общего журнала) слетает значения выбора на 0
это опять я что то не доглядел?))))
"
17.01.2010
20:45
#14
"> у меня в обоих случаях при открытие постое значение
Видимо, эта подзадача решается наличием строк:
Процедура ПриУстановкеБыстрогоОтбора()
...
Если ОтборПо = "по контрагенту" Тогда
...
ИначеЕсли ОтборПо = "по виду документов" Тогда
...
ИначеЕсли ОтборПо = "по кассе" Тогда //в конце вставляем это
ПриВыбореКассы();
ЗначениеВВидеСтроки=Строка(КассаДляОтбора);
КонецЕсли;
....
> но там при смене отбора(не закрывая Общего журнала) слетает значения выбора на 0
ну так надо смотреть что там система делает при смене отбора. И находится это все как раз в привеженной выше ПриУстановкеБыстрогоОтбора()
смотрите внимательно процедуру эту."
Видимо, эта подзадача решается наличием строк:
Процедура ПриУстановкеБыстрогоОтбора()
...
Если ОтборПо = "по контрагенту" Тогда
...
ИначеЕсли ОтборПо = "по виду документов" Тогда
...
ИначеЕсли ОтборПо = "по кассе" Тогда //в конце вставляем это
ПриВыбореКассы();
ЗначениеВВидеСтроки=Строка(КассаДляОтбора);
КонецЕсли;
....
> но там при смене отбора(не закрывая Общего журнала) слетает значения выбора на 0
ну так надо смотреть что там система делает при смене отбора. И находится это все как раз в привеженной выше ПриУстановкеБыстрогоОтбора()
смотрите внимательно процедуру эту."
17.01.2010
22:25
#15
"Ты не совсем правильно меня понял, чего чего а синтаксис Если я помню еще с бэйсика
и вопрос был в чем разница этих двух процедур
по поводу ошибки она была в
> КассаДляОтбора =ВосстановитьЗначение("КассаДляОтбораЖурнала");
впрос по синтаксису
> ВидДокументаДляОтбора= ?(ПустоеЗначение(ВидДокументаДляОтбора)=1, 1, ВидДокументаДляОтбора);
то что перечисляется через запетую как я понял это перечисления возможных вариантов значения
что значит просто "1"? во всех остальных там стоит
> ПолучитьПустоеЗначение("Справочник.Кассы")"
и вопрос был в чем разница этих двух процедур
по поводу ошибки она была в
> КассаДляОтбора =ВосстановитьЗначение("КассаДляОтбораЖурнала");
впрос по синтаксису
> ВидДокументаДляОтбора= ?(ПустоеЗначение(ВидДокументаДляОтбора)=1, 1, ВидДокументаДляОтбора);
то что перечисляется через запетую как я понял это перечисления возможных вариантов значения
что значит просто "1"? во всех остальных там стоит
> ПолучитьПустоеЗначение("Справочник.Кассы")"
18.01.2010
07:55
#16
А, ясно...
В VB тоже есть такая функция: и в описание языка 1С смотрите:
?(,,)
Синтаксис:
?(,,)
Назначение:
Возвращает значение первого выражения, если условие истинно, иначе - значение второго выражения.
результат вычисления условного выражения.
Параметры:
- логическое выражение,
- выражение,
- выражение.
А про "1" - это номер, соответствующий элементу списка СписокВидовДокументов, по которому нужно выполнить отбор в журнале, если ВидДокументаДляОтбора пуст. То есть, придумано для вот чего. Ситуация:
1. Пользователь никогда ранее не пользовался этим механизмом отбора, поэтому ранее сохраненного значения вида документов для отбора для него нет.
2. Пользователь тычет в "установить отбор по виду документов". По какому виду по умолчанию нужно тут же включить отбор, если ранее этого не делалось? Ну по первому в списке просто и все. Этим и занимается алгоритм
В VB тоже есть такая функция: и в описание языка 1С смотрите:
?(,,)
Синтаксис:
?(,,)
Назначение:
Возвращает значение первого выражения, если условие истинно, иначе - значение второго выражения.
результат вычисления условного выражения.
Параметры:
- логическое выражение,
- выражение,
- выражение.
А про "1" - это номер, соответствующий элементу списка СписокВидовДокументов, по которому нужно выполнить отбор в журнале, если ВидДокументаДляОтбора пуст. То есть, придумано для вот чего. Ситуация:
1. Пользователь никогда ранее не пользовался этим механизмом отбора, поэтому ранее сохраненного значения вида документов для отбора для него нет.
2. Пользователь тычет в "установить отбор по виду документов". По какому виду по умолчанию нужно тут же включить отбор, если ранее этого не делалось? Ну по первому в списке просто и все. Этим и занимается алгоритм
18.01.2010
11:35
#17
Спасибо за эти примеры. Меня тут попросили прийти и обновить комплексную - буду на месте править ошибки
18.01.2010
12:12
#18
У меня их больше, но я пока не могу обобщить и все выложить. В связи с последними веяниями в законодательстве работы много
18.01.2010
23:05
#19
"> Ну и в описание языка 1С смотрите:
> ?(,,)
> Синтаксис:
> ?(,,)
> Назначение:
> Возвращает значение первого выражения, если условие истинно, иначе - значение второго выражения.
> результат вычисления условного выражения.
> Параметры:
> - логическое выражение,
> - выражение,
> - выражение.
>
> А про "1" - это номер, соответствующий элементу списка СписокВидовДокументов, по которому нужно выполнить отбор в журнале, если ВидДокументаДляОтбора пуст. То есть, придумано для вот чего. Ситуация:
> 1. Пользователь никогда ранее не пользовался этим механизмом отбора, поэтому ранее сохраненного значения вида документов для отбора для него нет.
> 2. Пользователь тычет в "установить отбор по виду документов". По какому виду по умолчанию нужно тут же включить отбор, если ранее этого не делалось? Ну по первому в списке просто и все. Этим и занимается алгоритм
ну рассмотрем другой пример синтаксиса
> СписокВидовДокументов.ВыбратьЗначение(ВыбЗначение,"Выбор вида документов",,60,0);
выбрать значение, а именно "выбор вида документа", " " (хз что за пробел, свобода выбора наверно), "60" занчение вот только чего?, "0" невыбранно нечего
извиняюсь за каламбур я ток учусь))), щас пытаюсь понять как сделать так что бы
> Процедура ПоКнопкеЗначение()
выбор перемещался не в первую строку а в ранние выбранную
помойму это
> Если ПустоеЗначение(ВидДокументаДляОтбора)>0 Тогда
> ВыбЗначение = """";
если значение отлично от 0, то выбрать значение """", как я понял которое ранние установлено?
"
> ?(,,)
> Синтаксис:
> ?(,,)
> Назначение:
> Возвращает значение первого выражения, если условие истинно, иначе - значение второго выражения.
> результат вычисления условного выражения.
> Параметры:
> - логическое выражение,
> - выражение,
> - выражение.
>
> А про "1" - это номер, соответствующий элементу списка СписокВидовДокументов, по которому нужно выполнить отбор в журнале, если ВидДокументаДляОтбора пуст. То есть, придумано для вот чего. Ситуация:
> 1. Пользователь никогда ранее не пользовался этим механизмом отбора, поэтому ранее сохраненного значения вида документов для отбора для него нет.
> 2. Пользователь тычет в "установить отбор по виду документов". По какому виду по умолчанию нужно тут же включить отбор, если ранее этого не делалось? Ну по первому в списке просто и все. Этим и занимается алгоритм
ну рассмотрем другой пример синтаксиса
> СписокВидовДокументов.ВыбратьЗначение(ВыбЗначение,"Выбор вида документов",,60,0);
выбрать значение, а именно "выбор вида документа", " " (хз что за пробел, свобода выбора наверно), "60" занчение вот только чего?, "0" невыбранно нечего
извиняюсь за каламбур я ток учусь))), щас пытаюсь понять как сделать так что бы
> Процедура ПоКнопкеЗначение()
выбор перемещался не в первую строку а в ранние выбранную
помойму это
> Если ПустоеЗначение(ВидДокументаДляОтбора)>0 Тогда
> ВыбЗначение = """";
если значение отлично от 0, то выбрать значение """", как я понял которое ранние установлено?
"
Читают тему
(гостей: 1)