Имя: Пароль:
1C
 
null в ОперацииБух
,
0 Александр111
 
08.01.21
15:17
Добрый день!

При сворачивании базы в бухпроводках по некоторым счетам значения субконто установились как null

я попробовал программно создать операцию и перевести этот остаток с null  на пустые ссылки, но сделать проводку, где по одному из субконто у меня будет null не удается, она упорно встает как неопределено
Как исправить? Могу изменить исходную операцию, но нужно сделать отдельной операцией.
1 Ненавижу 1С
 
гуру
08.01.21
15:21
(0) вы там определитесь уже NULL, Неопределено или пустые ссылки...
2 RomanYS
 
08.01.21
15:22
(0) null  - значит нет записи в таблице субонто, неопределено - пустое значение для составного типа
3 Александр111
 
08.01.21
15:25
Стоит Null
4 Ненавижу 1С
 
гуру
08.01.21
15:26
скорее всего меняли состав субконто на счетах. Верните субконто
5 Александр111
 
08.01.21
15:27
Нужно вместо Null установить пустую ссылку т.е. дать сторнирующую операцию  с Null
и правильную с Неопределено
6 Александр111
 
08.01.21
15:28
(4) cскорее всего да, но хотелось бы исправить проводками
7 RomanYS
 
08.01.21
15:32
(5) >> дать сторнирующую операцию  с Null
Нужно удалить запись с этим субконто, не помню можно ли это сделать кодом. Через сериализацию точно можно.
И записывать набор только в режиме загрузка=Истина, иначе все недостающие записи восстановятся.
Проще и правильнее отремонтировать исходную битую операцию
8 Александр111
 
08.01.21
15:35
Откорректировать исходную операцию не проблема, но хотелось бы понять как все таки сделать это с помощью сторнирующих проводок.
9 RomanYS
 
08.01.21
15:39
(8) Очевидно нужно заполнить их также, т.е. криво
10 Александр111
 
08.01.21
15:44
Даже если устанавливать програмно субконто=Null записывается как неопределено.
Остаток по субконто с типом null и что с ним делать?
11 RomanYS
 
08.01.21
15:51
(10) Логично, автоматическое приведение типов. Ты игнорируешь что тебе пишут? Перечитай (2)
12 Александр111
 
08.01.21
15:51
И
13 Александр111
 
08.01.21
15:52
(0) но нужно сделать отдельной операцией.
14 RomanYS
 
08.01.21
15:52
(12)

РегистрБухгалтерииСубконто.<Имя регистра бухгалтерии> (AccountingRegisterExtDimensions.<Accouting register name>)
Удалить (Delete)
Синтаксис:
Удалить(<ВидСубконто>)
Параметры:
<ВидСубконто> (обязательный)
Тип: ПланВидовХарактеристикСсылка.<Имя плана видов характеристик>.
Передается ключ элемента соответствия, который необходимо удалить.
Описание:
Удаляет элемент коллекции субконто.

И записывай в режиме загрузки
15 Александр111
 
08.01.21
16:01
(14) т. е. все таки корректировка исходной операции. Но (о) нужно сделать отдельной операцией.
16 RomanYS
 
08.01.21
16:02
(15) Нет не корректировка. В новой операции удали субконто где нужно получить Null
17 Александр111
 
08.01.21
16:04
Ок. понял, завтра попробую. Спасибо.
18 Ёпрст
 
08.01.21
17:18
(0) почитай на ночь

http://catalog.mista.ru/public/1142232/
19 Александр111
 
09.01.21
08:31
(14) не получается, вместо null присваивает пустое значение, так же как и при использовании оператора неопределено. (18) Нет стартмани чтобы скачать.
Причина появления ошибки видимо в том, что в программе по 16 год не велся партионный учет, а с 16 по 17  начали вести. остатки сворачивали на начало 18 г.
из http://catalog.mista.ru/public/1142232/ ПРАВИЛО:В случае отключенного на счете признака ведения учета, соответствующее измерение должно быть не ПустаяСсылка справочника, а равняться NULL.
20 RomanYS
 
09.01.21
09:36
(19) код покажи
21 Александр111
 
09.01.21
09:52
Проводка = РегХозрасчетный.Добавить();
            Проводка.Период = Объект.ДатаоКОНЧАНИЯ;
            Проводка.Регистратор = ДокОперацияСсылка;
            Если Кд.Счет.Вид=ВидСчета.Активный Тогда
                Проводка.СчетКт = Счет000;
                Проводка.СчетДт = Кд.Счет;
                кол = 0;
                
                Если Кд.Счет.УчетПоПодразделениям=Истина Тогда
                    Проводка.ПодразделениеДт =Кд.Подразделение;
                КонецЕсли;
                кол = 0;
        
                Пока кол < Кд.Счет.ВидыСубконто.Количество() Цикл
                    Субконто =Кд.Счет.ВидыСубконто[кол].ВидСубконто;
                    
                    Если кол = 0 Тогда
                        //    Проводка.ПодразделениеКт = Подр1;
                        Проводка.СубконтоДт[Субконто] = Кд.Субконто1;
                    ИначеЕсли кол = 1 Тогда
                        Проводка.СубконтоДт[Субконто] = Кд.Субконто2;
                    ИначеЕсли кол = 2 Тогда
                        
                        Если  Кд.Субконто3=NULL Тогда
                            Сообщить("!!");
                        //Проводка.СубконтоДт[Субконто] = неопределено;
                        Проводка.СубконтоДт.Удалить(Субконто);
                        Иначе
                            
                        Проводка.СубконтоДт[Субконто] = Кд.Субконто3;
                        КонецЕсли;
                    КонецЕсли;
                    кол = кол+1;
22 RomanYS
 
09.01.21
09:55
(21) Что такое Кд? "Кд.Субконто3=NULL" точно срабатывает?
Про режи загрузки при записи не забыл?
23 Александр111
 
09.01.21
09:58
Кд.Субконто3=NULL" точно срабатывает,
Но если присваиваю Кд.Субконто3=NULL; то присваивается неопределено,
режим загрузки истина
24 RomanYS
 
09.01.21
10:24
(23) Попробуй выгрузить в XML и удалить (у нужной проводки)

<ExtDimensionTypeDr>8bbba69b-fc84-4ec0-aeef-2a4b48042eca</ExtDimensionTypeDr>
                        <ExtDimensionDr xsi:nil="true"/>

ИД субконто у тебя будет другое. И загрузи обратно.
И будь готов к тому что итоги по РБ возможно придётся пересчитывать
25 Александр111
 
09.01.21
10:30
Универсальной обработкой?
26 RomanYS
 
09.01.21
10:35
(25) ВыгрузкаЗагрузкаXML c ИТСа, есть в дистре КД2
27 Cyberhawk
 
09.01.21
10:36
нулл в коде никакого смысла никуда присваивать (при записи) нет
28 Александр111
 
09.01.21
10:40
Проводка.СубконтоДт.Вставить(Субконто,Null); -?
29 RomanYS
 
09.01.21
10:43
(28) нет. Null значит нет такой записи
30 Александр111
 
09.01.21
10:48
Короче, програмно - никак, через выгрузку загрузку xml - как то извращенно. Придется исправлять первичные документы.
31 RomanYS
 
09.01.21
10:52
(30) :)))
32 Ёпрст
 
09.01.21
11:00
(30) у тя файловая ?
Так то в скуле апдейт и привет
33 Александр111
 
09.01.21
11:02
Нужно средствами 1с (32)
34 Александр111
 
09.01.21
11:44
сделал так
Выборка = Документы.ОперацияБух.Выбрать(нАЧАЛОдНЯ(ДатаНачала),кОНЕЦдНЯ(ДатаОкончания),,);
    Пока выборка.Следующий() Цикл
    //Выборка=УдалитьОпер;
        Если Выборка.ПометкаУдаления=Ложь Тогда
            Набор = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
            Набор.Отбор.Регистратор.Установить(Выборка.Ссылка);
            Набор.Прочитать();
            
            
            Для каждого Запись из Набор Цикл
                кол = 0;
                
                Пока кол < Запись.СчетДт.ВидыСубконто.Количество() Цикл
                    Субконто =Запись.СчетДт.ВидыСубконто[кол].ВидСубконто;
                    
                    Если кол = 0 Тогда
                        
                        Если  Запись.СубконтоДт[Субконто]=NULL или Запись.СубконтоДт[Субконто]=неопределено Тогда
                            Запись.СубконтоДт[Субконто]=неопределено;
                            //Сообщить(Запись.СубконтоДт[Субконто]);
                        Конецесли;
                        
                    ИначеЕсли кол = 1 Тогда
                        
                        Если    Запись.СубконтоДт[Субконто]=NULL или Запись.СубконтоДт[Субконто]=неопределено Тогда
                            Запись.СубконтоДт[Субконто]=неопределено;
                            //Сообщить(Запись.СубконтоДт[Субконто]);

                        Конецесли;    
                    ИначеЕсли кол = 2 Тогда
                        
                        Если    Запись.СубконтоДт[Субконто]=NULL или Запись.СубконтоДт[Субконто]=неопределено Тогда
                            Запись.СубконтоДт[Субконто]=неопределено;
                            //Сообщить(Запись.СубконтоДт[Субконто]);

                        КонецЕсли;
                        
                    КонецЕсли;
                    кол = кол+1;
                    ////Сообщить(счет);
                    
                    
                    
                КонецЦикла;
                
                кол = 0;
                
                Пока кол < Запись.СчетКт.ВидыСубконто.Количество() Цикл
                    Субконто =Запись.СчетКт.ВидыСубконто[кол].ВидСубконто;
                    
                    Если кол = 0 Тогда
                        
                        Если  Запись.СубконтоКт[Субконто]=NULL или Запись.СубконтоКт[Субконто]=неопределено Тогда
                            Запись.СубконтоКт[Субконто]=неопределено;
                            //Сообщить(Запись.СубконтоКт[Субконто]);
                        Конецесли;
                        
                    ИначеЕсли кол = 1 Тогда
                        
                        Если    Запись.СубконтоКт[Субконто]=NULL или Запись.СубконтоКт[Субконто]=неопределено Тогда
                            Запись.СубконтоКт[Субконто]=неопределено;
                            //Сообщить(Запись.СубконтоКт[Субконто]);

                        Конецесли;    
                    ИначеЕсли кол = 2 Тогда
                        
                        Если    Запись.СубконтоКт[Субконто]=NULL или Запись.СубконтоКт[Субконто]=неопределено Тогда
                            Запись.СубконтоКт[Субконто]=неопределено;
                            //Сообщить(Запись.СубконтоКт[Субконто]);

                        КонецЕсли;
                        
                    КонецЕсли;
                    кол = кол+1;
                    ////Сообщить(счет);
                    
                    
                    
                КонецЦикла;

                
            КонецЦикла;
             Набор.Записать();
        Конецесли;
        КонецЦикла;
35 Ёпрст
 
09.01.21
11:53
И зачем Неопределенно туда пихаешь, если должен быть NULL ?
36 RomanYS
 
09.01.21
12:11
(35)
1. "зачем" - он решил исправить кривые проводки, а не пытаться их сторнировать
2. "если должен быть NULL" - так NULL всё равно не запихнёшь
37 Александр111
 
09.01.21
12:12
Точно
38 RomanYS
 
09.01.21
12:13
(34) сработало? - ну и ладно
Вообще конечно вермишель из "ИначеЕсли кол = 1 Тогда" вывзывает тихий ужас ))
39 Александр111
 
09.01.21
12:17
Лепил на скорую руку
40 RomanYS
 
09.01.21
12:37
...            ДтКт = Новый Структура("Дт,Кт");
            
            Для каждого Запись из Набор Цикл
                Для каждого ЭлДтКт Из ДтКт Цикл
                    Для каждого ЭлВидСубконто Из Запись["Счет" +ЭлДтКт.Ключ].ВидыСубконто Цикл
                        ВидСубконто = ЭлВидСубконто .ВидСубконто;
                        ОписаниеТипа = ВидСубконто.ТипЗначения;
                        Запись["Субконто" + ЭлДтКт.Ключ][ВидСубконто] = ВидСубконто.ПривестиЗначение(Запись["Субконто" + ЭлДтКт.Ключ][ВидСубконто]);
                    КонецЦикла;
                КонецЦикла;
            КонецЦикла;
41 RomanYS
 
09.01.21
12:51
*(40) описка
Запись["Субконто" + ЭлДтКт.Ключ][ВидСубконто] = ОписаниеТипа.ПривестиЗначение(Запись["Субконто" + ЭлДтКт.Ключ][ВидСубконто]);
42 Александр111
 
09.01.21
13:08
ТАК ККРАСИВШЕ )))