Имя: Пароль:
1C
1C 7.7
v7: "Черный" запрос к операциям
, ,
0 Дух1984
 
10.04.15
11:54
Предыстория:
В системе был один план счетов (старый). С 2015 года добавился еще один (новый), по которому на данный момент и ведется работа. Имеется отчет, который необходимо переделать под новый план счетов. Выборка данных в отчете происходит с помощью запроса к операциям:

    "//{{ЗАПРОС(ГП_ДО)
    |Период с НачДата по КонДата;  
    |
    |ОбрабатыватьДокументы Проведенные;
    |Обрабатывать НеПомеченныеНаУдаление;
    |
    |Опер            = Операция.ТекущийДокумент;
    |СчетДт            = Операция.Дебет.Счет;
    |СчетКр            = Операция.Кредит.Счет;
    |ГотоваяПродукция     = Операция.Дебет.ГотоваяПродукция;
    |МестаХранения         = Операция.Дебет.МестаХранения;
    |Колво            = Операция.Количество;
    |Сумма            = Операция.Сумма;
    |Функция СуммаДО = ДО(Сумма);
    |Функция КолвоКО = ДО(Колво);
    |Условие ( СчетДт = Сч216_1 );
    |Группировка Опер;
    |Группировка СчетДт;
    |Группировка ГотоваяПродукция;
    |Группировка День;
    |"//}}ЗАПРОС

Этот запрос не работает по новому плату счетов. В переменной "Сч216_1" счет из нового плана счетов (проверено), обороты по счету из переменной на новом плане счетов есть (тоже проверено).

Если убрать условие, то отчет выдает данные, но группировка "СчетДт" просто пустая.

Прошу помощи в определении ошибки.
1 Ёпрст
 
10.04.15
11:57
(0) При задании параметра Сч216_1 указывать нужный план счетов
2 Дух1984
 
10.04.15
11:57
(1) Я уже писал - счет из нового плана счетов - проверено
3 Дмитрий
 
10.04.15
11:58
(0) а точно есть операции, у которых СчетДт = Сч216_1
4 Ёпрст
 
10.04.15
11:58
(2) нам отсюда не видно, как задается этот параметр
5 Дух1984
 
10.04.15
12:08
Если НачДата < Константа.ДатаВступленияВСилуНСБУ Тогда
        Сч211     = СчетПоКоду("211");
        Сч216_1 = СчетПоКоду("216.1");
        Сч711_1 = СчетПоКоду("711.1");
        Сч811_1 = СчетПоКоду("811.1");
        Сч811_2 = СчетПоКоду("811.2");
        Сч811_3 = СчетПоКоду("811.3");
        Сч811_4 = СчетПоКоду("811.4");
        Сч813     = СчетПоКоду("813");
    Иначе
        Сч211     = глВернутьНовыйСчетПоКодуСтарого(СчетПоКоду("211"));
        Сч216_1 = глВернутьНовыйСчетПоКодуСтарого(СчетПоКоду("216.1"));
        Сч711_1 = глВернутьНовыйСчетПоКодуСтарого(СчетПоКоду("711.1"));
        Сч811_1 = глВернутьНовыйСчетПоКодуСтарого(СчетПоКоду("811.1"));
        Сч811_2 = глВернутьНовыйСчетПоКодуСтарого(СчетПоКоду("811.2"));
        Сч811_3 = глВернутьНовыйСчетПоКодуСтарого(СчетПоКоду("811.3"));
        Сч811_4 = глВернутьНовыйСчетПоКодуСтарого(СчетПоКоду("811.4"));
        Сч813     = глВернутьНовыйСчетПоКодуСтарого(СчетПоКоду("813"));
    КонецЕсли;
6 Дух1984
 
10.04.15
12:08
глобальная процедура возвращает счет из нового плана счетов.
7 Ёпрст
 
10.04.15
12:10
(5) И ?
Код будет, где  Сч216_1 присваивается счет из нового плана счетов ?
8 Дух1984
 
10.04.15
12:11
(7) я уже писал - счет точно из нового плана счетов. Остановил отладчиком до выполнения запроса и проверил "Сч216_1.ПланСчетов()" - система показала что план счетов 2015 года
9 Ёпрст
 
10.04.15
12:12
(8) см. (4)
10 Дух1984
 
10.04.15
12:13
Функция глВернутьНовыйСчетПоКодуСтарого(СтарыйКод, СообщатьОРасходенияхВКоличествеСубконто = "Нет", СообщатьОРасходенияхВВидахСубконто = "Нет") Экспорт
    
    Если ПустоеЗначение(СтарыйКод) = 1 Тогда
        Возврат "";
    КонецЕсли;
    
    спрСинхронизацияСчетов = СоздатьОбъект("Справочник.СинхронизацияСчетов");
    Если ТипЗначенияСтр(СтарыйКод) = "Счет" Тогда
        Если спрСинхронизацияСчетов.НайтиПоРеквизиту("СчетСтарый", СтарыйКод, 1) = 1 Тогда
            Если ПустоеЗначение(спрСинхронизацияСчетов.СчетНовый) = 1 Тогда
                Сообщить("Не найдено соответствие в новом плане счетов для счета " + СтарыйКод.Код + "!", "!!!");
                Возврат "";
            Иначе
                Если СообщатьОРасходенияхВКоличествеСубконто =  "Да" Тогда
                    Если СтарыйКод.КоличествоСубконто() <> спрСинхронизацияСчетов.СчетНовый.КоличествоСубконто() Тогда
                        Сообщить("Не совпадает количество субконто между счетами! Старый счет " + СокрЛП(СтарыйКод) + " имеет " + СтарыйКод.КоличествоСубконто() + ", новый счет " + СокрЛП(спрСинхронизацияСчетов.СчетНовый) + " имеет " + спрСинхронизацияСчетов.СчетНовый.КоличествоСубконто());
                    КонецЕсли;
                КонецЕсли;
                Если СообщатьОРасходенияхВВидахСубконто = "Да" Тогда
                    Если СтарыйКод.ВидСубконто(1) <> спрСинхронизацияСчетов.СчетНовый.ВидСубконто(1) Тогда
                        Сообщить("Вид субконто 1 старого счета " + СокрЛП(СтарыйКод) + " : " + СтарыйКод.ВидСубконто(1) + ", не совпадает с видом субконто нового счета " + СокрЛП(спрСинхронизацияСчетов.СчетНовый) + " : " + спрСинхронизацияСчетов.СчетНовый.ВидСубконто(1));
                    КонецЕсли;
                    Если СтарыйКод.ВидСубконто(2) <> спрСинхронизацияСчетов.СчетНовый.ВидСубконто(2) Тогда
                        Сообщить("Вид субконто 2 старого счета " + СокрЛП(СтарыйКод) + " : " + СтарыйКод.ВидСубконто(2) + ", не совпадает с видом субконто нового счета " + СокрЛП(спрСинхронизацияСчетов.СчетНовый) + " : " + спрСинхронизацияСчетов.СчетНовый.ВидСубконто(2));
                    КонецЕсли;
                    Если СтарыйКод.ВидСубконто(3) <> спрСинхронизацияСчетов.СчетНовый.ВидСубконто(3) Тогда
                        Сообщить("Вид субконто 3 старого счета " + СокрЛП(СтарыйКод) + " : " + СтарыйКод.ВидСубконто(3) + ", не совпадает с видом субконто нового счета " + СокрЛП(спрСинхронизацияСчетов.СчетНовый) + " : " + спрСинхронизацияСчетов.СчетНовый.ВидСубконто(3));
                    КонецЕсли;
                КонецЕсли;
                Возврат спрСинхронизацияСчетов.СчетНовый;
            КонецЕсли;
        КонецЕсли;
    ИначеЕсли ТипЗначенияСтр(СтарыйКод) = "Строка" Тогда
        Если спрСинхронизацияСчетов.НайтиПоРеквизиту("СчетСтарый", СчетПоКоду(СтарыйКод, ПланыСчетов.Основной), 1) = 1 Тогда
            Если ПустоеЗначение(спрСинхронизацияСчетов.СчетНовый) = 1 Тогда
                Сообщить("Не найдено соответствие в новом плане счетов для счета " + СокрЛП(СтарыйКод) + "!", "!!!");
                Возврат "";
            Иначе
                Если СообщатьОРасходенияхВКоличествеСубконто =  "Да" Тогда
                    Если СчетПоКоду(СтарыйКод, ПланыСчетов.Основной).КоличествоСубконто() <> спрСинхронизацияСчетов.СчетНовый.КоличествоСубконто() Тогда
                        Сообщить("Не совпадает количество субконто между счетами! Старый счет " + СокрЛП(СтарыйКод) + " имеет " + СчетПоКоду(СтарыйКод, ПланыСчетов.Основной).КоличествоСубконто() + ", новый счет " + СокрЛП(спрСинхронизацияСчетов.СчетНовый) + " имеет " + спрСинхронизацияСчетов.СчетНовый.КоличествоСубконто());
                    КонецЕсли;
                КонецЕсли;
                Если СообщатьОРасходенияхВВидахСубконто = "Да" Тогда
                    Если СчетПоКоду(СтарыйКод, ПланыСчетов.Основной).ВидСубконто(1) <> спрСинхронизацияСчетов.СчетНовый.ВидСубконто(1) Тогда
                        Сообщить("Вид субконто 1 старого счета " + СокрЛП(СтарыйКод) + " : " + СчетПоКоду(СтарыйКод, ПланыСчетов.Основной).ВидСубконто(1) + ", не совпадает с видом субконто нового счета " + СокрЛП(спрСинхронизацияСчетов.СчетНовый) + " : " + спрСинхронизацияСчетов.СчетНовый.ВидСубконто(1));
                    КонецЕсли;
                    Если СчетПоКоду(СтарыйКод, ПланыСчетов.Основной).ВидСубконто(2) <> спрСинхронизацияСчетов.СчетНовый.ВидСубконто(2) Тогда
                        Сообщить("Вид субконто 2 старого счета " + СокрЛП(СтарыйКод) + " : " + СчетПоКоду(СтарыйКод, ПланыСчетов.Основной).ВидСубконто(2) + ", не совпадает с видом субконто нового счета " + СокрЛП(спрСинхронизацияСчетов.СчетНовый) + " : " + спрСинхронизацияСчетов.СчетНовый.ВидСубконто(2));
                    КонецЕсли;
                    Если СчетПоКоду(СтарыйКод, ПланыСчетов.Основной).ВидСубконто(3) <> спрСинхронизацияСчетов.СчетНовый.ВидСубконто(3) Тогда
                        Сообщить("Вид субконто 3 старого счета " + СокрЛП(СтарыйКод) + " : " + СчетПоКоду(СтарыйКод, ПланыСчетов.Основной).ВидСубконто(3) + ", не совпадает с видом субконто нового счета " + СокрЛП(спрСинхронизацияСчетов.СчетНовый) + " : " + спрСинхронизацияСчетов.СчетНовый.ВидСубконто(3));
                    КонецЕсли;
                КонецЕсли;
                Возврат спрСинхронизацияСчетов.СчетНовый;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    
    Возврат "";
    
КонецФункции // глВернутьНовыйСчетПоКодуСтарого()
11 Ёпрст
 
10.04.15
12:18
(10) круто. С чего уверенность, что в справочнике забивается счет из нового плана счетов, а не из старого при создании соответствия ?
12 Дух1984
 
10.04.15
12:19
во-первых: уверенность возникает из-за типа реквизита "новый код" - он типа счет.новыйплансчетов
во-вторых: (8)
13 Ёпрст
 
10.04.15
12:23
Ну и переходим к самому главному, если запрос ничего не возвращает, значит нет операций в которых в дебете торчит этот счет за выбранный период запроса.
14 Дух1984
 
10.04.15
12:26
(13) Операции есть. Оборотка по этому счету (из нового плана счетов) показывает это.
15 Ёпрст
 
10.04.15
12:26
(14) не верю.. и за какой период ?
16 Дух1984
 
10.04.15
12:27
(15) за первый квартал сего года.
17 Дух1984
 
10.04.15
12:27
(15) Могу дать тим - убедишься сам
18 Ёпрст
 
10.04.15
12:27
и.. вот так, че кажет ???
19 Дух1984
 
10.04.15
12:28
(18) ?
20 Ёпрст
 
10.04.15
12:29
Сч216_1 = СчетПоКоду("216.1",ПланыСчетов.ТвоёимяНовогоПланаСчетов);
21 Дух1984
 
10.04.15
12:29
Кажет что за первый квартал этого года по счету 216.1 из нового плана счетов есть обороты
22 Ёпрст
 
10.04.15
12:29
если ЭТО в текст запроса передавать
23 Ёпрст
 
10.04.15
12:29
нет, че кажет твой запрос, есть че ?
24 Дух1984
 
10.04.15
12:29
(22) не помогает
25 Дух1984
 
10.04.15
12:31
(23) ты пытаешься найти ошибку в моем коде -но ее там нет. Процитирую тебе еще раз фразу из моего вопроса: "Если убрать условие, то отчет выдает данные, но группировка "СчетДт" просто пустая". Т.е.проблема не в том, что счет не тот, а в том, что в проводках запрос вообще не видит счета. Никакого. значение группировки - NULL
26 Ёпрст
 
10.04.15
12:33
Другие условия есть ?
27 Дух1984
 
10.04.15
12:35
нет
я выложил весь текст запроса.
28 Дух1984
 
10.04.15
12:36
вот весь листинг:

    Если НачДата < Константа.ДатаВступленияВСилуНСБУ Тогда
        Сч211     = СчетПоКоду("211");
        Сч216_1 = СчетПоКоду("216.1");
        Сч711_1 = СчетПоКоду("711.1");
        Сч811_1 = СчетПоКоду("811.1");
        Сч811_2 = СчетПоКоду("811.2");
        Сч811_3 = СчетПоКоду("811.3");
        Сч811_4 = СчетПоКоду("811.4");
        Сч813     = СчетПоКоду("813");
    Иначе
        Сч211     = глВернутьНовыйСчетПоКодуСтарого(СчетПоКоду("211"));
        Сч216_1 = глВернутьНовыйСчетПоКодуСтарого("216.1");
        Сч711_1 = глВернутьНовыйСчетПоКодуСтарого(СчетПоКоду("711.1"));
        Сч811_1 = глВернутьНовыйСчетПоКодуСтарого(СчетПоКоду("811.1"));
        Сч811_2 = глВернутьНовыйСчетПоКодуСтарого(СчетПоКоду("811.2"));
        Сч811_3 = глВернутьНовыйСчетПоКодуСтарого(СчетПоКоду("811.3"));
        Сч811_4 = глВернутьНовыйСчетПоКодуСтарого(СчетПоКоду("811.4"));
        Сч813     = глВернутьНовыйСчетПоКодуСтарого(СчетПоКоду("813"));
    КонецЕсли;
    
    Если ( КонДата < НачДата ) Тогда
        Предупреждение ( "Неправильно задан период." );
        Возврат;
    КонецЕсли;

    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(ГП_ДО)
    |Период с НачДата по КонДата;  
    |
    |ОбрабатыватьДокументы Проведенные;
    |Обрабатывать НеПомеченныеНаУдаление;
    |
    |Опер                 = Операция.ТекущийДокумент;
    |СчетДт             = Операция.Дебет.Счет;
    |СчетКр             = Операция.Кредит.Счет;
    |ГотоваяПродукция     = Операция.Дебет.ГотоваяПродукция;
    |МестаХранения         = Операция.Дебет.МестаХранения;
    |Колво                 = Операция.Количество;
    |Сумма                 = Операция.Сумма;
    |
    |Функция СуммаДО = ДО(Сумма);
    |Функция КолвоКО = ДО(Колво);
    |
    |Условие ( СчетДт = Сч216_1 );
    |
    |Группировка Опер;
    |Группировка СчетДт;
    |Группировка ГотоваяПродукция;
    |Группировка День;
    |
    |"//}}ЗАПРОС
    ;

    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Сообщить("Ошибка при выполнении запроса!");
        Возврат;
    КонецЕсли;
    
    тзЗапроса = СоздатьОбъект("ТаблицаЗначений");
    Запрос.Выгрузить(тзЗапроса);
    тзЗапроса.ВыбратьСтроку();
29 Ёпрст
 
10.04.15
12:41
вот это всё лишнее

    |ОбрабатыватьДокументы Проведенные;
    |Обрабатывать НеПомеченныеНаУдаление;

а так, база скуль ? дбф ?
Реиндекс нужно сделать в первую очередь, пересчет бух итогов во вторую.
30 Дух1984
 
10.04.15
12:42
(29) база ДБФ. делал полное ТиИ - не помогло
31 Ёпрст
 
10.04.15
12:44
при просмотре ТЗ, колонка СчетДт  пустая, если условия заремить ?
32 Дух1984
 
10.04.15
12:45
(31) да
33 Ёпрст
 
10.04.15
12:47
и за этот период точно были операции ?
34 Дух1984
 
10.04.15
12:48
ога
35 Ёпрст
 
10.04.15
12:50
и.. точно был ДО ?
36 Дух1984
 
10.04.15
12:51
Сейчас лично внес бух.операцию тестовую - не кажет ее запрос с условием по счету
37 Дух1984
 
10.04.15
12:51
(35) "Мамой клянус, да?.." :)
38 Дух1984
 
10.04.15
12:52
ОН ДО видит - он счетДт не видит
39 Ёпрст
 
10.04.15
12:52
а вот так , есть че ?

    |Функция СуммаДО = ДО(Сумма);
    |Функция КолвоДО = ДО(Колво);
    |Функция СуммаКО = КО(Сумма);
    |Функция КолвоКО = КО(Колво);
40 Ёпрст
 
10.04.15
12:54
Если и так, нет , то снос *.cdx, для начала и заход монопольно, потом проверить
41 Дух1984
 
10.04.15
12:54
Да (с закомментированным условием). причем суммы совпадают с анализом субконто.
42 Ёпрст
 
10.04.15
12:55
(41) "Да" - это ответ на какой вопрос ?
43 Дух1984
 
10.04.15
12:56
(42) на (39)
44 Дух1984
 
10.04.15
12:57
(40) Не помогло
45 Ёпрст
 
10.04.15
12:58
(43) т.е при добавлении всех функций, в группировке по счету дебета, там не пусто и есть твой счет из созданной тобой бух операции ?
46 Дух1984
 
10.04.15
13:00
нет. группировка по счету пустая по-любому
47 Ёпрст
 
10.04.15
13:01
дай мд посмотреть
48 Дух1984
 
10.04.15
13:01
как?
49 Дух1984
 
10.04.15
13:01
скайп есть?
50 Ёпрст
 
10.04.15
13:04
51 Ёпрст
 
10.04.15
13:05
сюда кинь
52 Дух1984
 
10.04.15
13:08
Отправил
53 Ёпрст
 
10.04.15
13:11
пока ничего нет
54 trad
 
10.04.15
13:13
попробовать период поставить меньше квартала
55 Дух1984
 
10.04.15
13:15
(53) мне ничего не вернулось - значит должно дойти.
56 Дух1984
 
10.04.15
13:16
(54) не помогает. за предыдущий год по старому плану счетов и за квартал работало
57 Ёпрст
 
10.04.15
13:26
Ситуация воспроизводится, старый план счетов виден, новый - нет..
ща, посмотрю, в чем там затык
58 Дух1984
 
10.04.15
13:30
(57) Ок
59 Ёпрст
 
10.04.15
13:41
Короче, посмотрел в своей конфе - таже фигня. Не может он типизировать счет, если он  не основной.
60 Дух1984
 
10.04.15
13:45
(59) Т.е.выхода нет? только переписывать отчет на бух.итоги?
61 Ёпрст
 
10.04.15
13:46
Как-то ему нужно указать, как в БИ, что типа ИспользоватьПланСчетов другой.
62 Дух1984
 
10.04.15
13:48
В документации по черным запросам нет такого метода
63 Дух1984
 
10.04.15
13:49
Я понимаю, что ситуация, вообще-то говоря, не самая распространенная, и документации, и тем более опыта работы с такими вещами у народа нет.
64 Ёпрст
 
10.04.15
13:51
Я посмотрел у себя (у нас тоже 2 плана счетов). Но чорный запрос если и использовался, то только по 1 плану (он типа бух). А так везде БИ
65 Дух1984
 
10.04.15
13:52
Мне вот интересно как система определяет по какому ПС брать? Какой из них - основной? А вдруг у меня 2 ПС и названия вообще будут левые (не "Основной", а "ПС" и "ПС2")?
66 Дух1984
 
10.04.15
13:53
В сервисе в параметрах бухгалтерии можно указать основной ПС, и у меня выставлен новый, но это не влияет на выборку данных в черном запросе
67 Дмитрий
 
10.04.15
13:55
(65) Сервис Параметры Бухгалтерия Основной план счетов
68 Дух1984
 
10.04.15
13:56
(67) это пользовательская настройка, определяющая только то, какой ПС открывать по умолчанию при выборе счета в реквизите см.(66).
69 eshtrey
 
10.04.15
13:58
(65) конфигуратор "план счетов" основной - там указывается
70 Ёпрст
 
10.04.15
14:03
(66) в пофигураторе задается, в свойствах ПланаСчетов
71 Дух1984
 
10.04.15
14:03
(69) Помогло! Спасибо огромное! Только возникает вопрос: получается, что сменить интерактивно ПС невозможно?..
72 Ёпрст
 
10.04.15
14:04
Короче, эта гадость (чорный запрос) может только основной план счетов типизировать
73 Ёпрст
 
10.04.15
14:04
(71) неа..
74 Ёпрст
 
10.04.15
14:05
был бы скуль, смог бы подменить запрос на ходу.

А так, переписывай на прямой запрос - будет как хочешь
75 Дух1984
 
10.04.15
14:05
(74) понял
76 Дух1984
 
10.04.15
14:05
Всем спасибо за помощь!
Ошибка? Это не ошибка, это системная функция.