Имя: Пароль:
1C
1С v8
Не получается записать программно заполненный документ "ОперацияБух"
0 KizerSoze
 
08.10.12
18:33
Добрый вечер,
При попытке проведения программно заполненного документа операция появляется сообщение об ошибке "Запись не верна! Вид субконто "Контрагенты" не доступен для данной записи! (Регистр бухгалтерии: Журнал проводок; Номер строки 1)". Если создать и заполнить строку вручную с теми же значениями реквизитов - все записывается. Смотрел при отладке в табло реквизиты строк в программном и ручном варианте создания - совпадают на 100%. Ломаю голову со вчерашнего утра.
1 Wobland
 
08.10.12
18:46
хм, а я не знал
2 zzerro
 
08.10.12
18:57
Может не все данные заполнил
3 zak555
 
08.10.12
18:58
гже код ?
4 KizerSoze
 
08.10.12
19:09
Нет zzerro, данные заполнил все.
Я специально по таблу в отладке сравнивал варианты. Я даже создал копию базы, чтобы паралельно запустить процедуру записи, но ничего найти не удалось. Я попробовал отменить процедуру записи в моей обработке и просто открытьформу созданного и заполненного программно документа, но при попытке интерактивной записи выскакивает та же ошибка. Если я в этом же документе создаю новую строку вручную и перемещаю ее на первую позицию в таб. части, то выскакивает ошибка на вторую строку, т.е. ругается только программно заполненные строки.

//
zak555, вы о каком коде говорите? тут скорее скриншоты нужны.
5 KizerSoze
 
08.10.12
19:10
Сейчас код обработки выложу.
6 bodik911
 
08.10.12
19:10
Смотри Субконто
7 KizerSoze
 
08.10.12
19:15
Тут два документа "ПриходнойКассовыйОрдер" и "Операция" создаются.

Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   ТекПодразделение=Справочники.Подразделения.НайтиПоКоду("000000206");
       
   //Получим путь к файлу
   ПутьКПапкам=СокрЛП(ЭтотОбъект.ПутьКДанным);
   ИмяФайла=Лев(Строка(ЭтотОбъект.Дата),2)+Строка(0)+Сред(Строка(ЭтотОбъект.Дата),4,2)+Строка(0)+Сред(Строка(ЭтотОбъект.Дата),9,2)+".Dbf";
   СтрокаДата=Строка(ЭтотОбъект.Дата);
   XLS = Новый ComОбъект("Excel.Application");
   
   СписокПодразделений=Новый СписокЗначений;
   Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    Контрагенты.Ссылка,
       |    Контрагенты.Наименование
       |ИЗ
       |    Справочник.Контрагенты КАК Контрагенты
       |ГДЕ
       |    ПОДСТРОКА(Контрагенты.Наименование, 1, 11) = ""Сотрудники """;

   Результат = Запрос.Выполнить().Выгрузить();
   Для каждого ТекСтрока из Результат цикл
       Если СокрЛП(ТекСтрока.Наименование)<>"Сотрудники" тогда
           СписокПодразделений.Добавить(ТекСтрока.Ссылка);
       КонецЕсли;    
   КонецЦикла;
   
   Попытка
       XLS.Application.Workbooks.Open(ПутьКПапкам+Папка+"\"+ИмяФайла);
       Сообщить("Открываю файл " + ИмяФайла);
       БазаОткрыта = Истина;
   Исключение
        XLS.Quit();
        Сообщить(ОписаниеОшибки(),СтатусСообщения.Важное);
        БазаОткрыта = Ложь;
   КонецПопытки;
   
   //Ищем колонку "DOCTOR" и "SUM"
   Для ТекСтолбец=1 по 256 цикл
       Если XLS.ActiveSheet.Cells(1,ТекСтолбец).value="DOCTOR" тогда
           СтолбецДоктор=ТекСтолбец;
       ИначеЕсли XLS.ActiveSheet.Cells(1,ТекСтолбец).value="SUM" тогда    
           СтолбецСумма=ТекСтолбец;
       ИначеЕсли XLS.ActiveSheet.Cells(1,ТекСтолбец).value="NUM" тогда    
           СтолбецНум=ТекСтолбец;    
       КонецЕсли;
   КонецЦикла;
   
   Если СтолбецДоктор=Неопределено тогда
       Сообщить("Не удалось найти колонку ""DOCTOR"" в файле");
       ЗакрытиеБазы();
       Возврат;    
   ИначеЕсли  СтолбецСумма=Неопределено тогда    
       Сообщить("Не удалось найти колонку ""SUM"" в файле");
       ЗакрытиеБазы();
       Возврат;
   ИначеЕсли  СтолбецНум=Неопределено тогда    
       Сообщить("Не удалось найти колонку ""NUM"" в файле");
       ЗакрытиеБазы();
       Возврат;
   КонецЕсли;
   
   Тз=Новый ТаблицаЗначений;
   Тз.Колонки.Добавить("ДокторКод");
   Тз.Колонки.Добавить("ОбъектУчетаКод");
   Тз.Колонки.Добавить("Сумма");
   Тз.Колонки.Добавить("УдалитьВКонце"); //Код доктора в итоговых записях. После его копирования в детальные записи итоговые можно удалить.
   //Получим самую нижнюю строку
   ТекСтрока=2;
   Пока ЗначениеЗаполнено(XLS.ActiveSheet.Cells(ТекСтрока,СтолбецСумма).value)=Истина Цикл
       НоваяСтрока=Тз.Добавить();
       НоваяСтрока.ДокторКод=XLS.ActiveSheet.Cells(ТекСтрока,СтолбецДоктор).value;
       НоваяСтрока.ОбъектУчетаКод=XLS.ActiveSheet.Cells(ТекСтрока,СтолбецНум).value;
       НоваяСтрока.Сумма=XLS.ActiveSheet.Cells(ТекСтрока,СтолбецСумма).value;
       Если СтрДлина(СокрЛп(XLS.ActiveSheet.Cells(ТекСтрока,СтолбецДоктор).value))>0 тогда
           НоваяСтрока.УдалитьВКонце=Истина;
       Иначе;
           НоваяСтрока.УдалитьВКонце=Ложь;
       КонецЕсли;
       ТекСтрока=ТекСтрока+1;
   КонецЦикла;
   
   //Заполним КодДоктора в детальных записях
   Если Тз.Количество()>0 тогда
       Для х=1 по Тз.Количество()-1 цикл
           ТекСтрокаКодДоктор=СокрЛП(Тз[Тз.Количество()-х-1].ДокторКод);
           Если СтрДлина(ТекСтрокаКодДоктор)=0 тогда
               Тз[Тз.Количество()-х-1].ДокторКод=Тз[Тз.Количество()-х].ДокторКод;
           КонецЕсли;
       КонецЦикла;
   КонецЕсли;
   
   Отбор=Новый Структура("УдалитьВКонце",Ложь);
   Тз=Тз.Скопировать(Отбор);

   ЗакрытиеБазы();
   
   Тз.Свернуть("ДокторКод, ОбъектУчетаКод","Сумма");
   Тз.Колонки.Добавить("Доктор");
   Тз.Колонки.Добавить("ОбъектУчета");
   Для каждого ТекСтрока из Тз цикл
       Если Справочники.Контрагенты.НайтиПоКоду(ТекСтрока.ДокторКод)=Справочники.Контрагенты.ПустаяСсылка() тогда
           Сообщить("Не удалось найти доктора в спр ""Контрагенты"" с кодом "+ТекСтрока.ДокторКод);
           Возврат;
       КонецЕсли;
       ТекСтрока.Доктор=Справочники.Контрагенты.НайтиПоКоду(ТекСтрока.ДокторКод);
       
       ТекЭлементПрейскуранта=Справочники.Прейскурант.НайтиПоКоду(ТекСтрока.ОбъектУчетаКод);
       Если ТекЭлементПрейскуранта=Справочники.Прейскурант.ПустаяСсылка() тогда
           Сообщить("Не удалось найти элемент спр ""Прейскурант"" с кодом "+ТекСтрока.ОбъектУчетаКод);
           Возврат;
       КонецЕсли;
       ТекСтрока.ОбъектУчета=ТекЭлементПрейскуранта.ОбъектыУчета;
   КонецЦикла;
   
   //Проверяем, импортированы ли уже эти данные. Если да, тогда новый документ не создаем
   Запрос = Новый Запрос;
   Запрос.Текст =
       "ВЫБРАТЬ
       |    НД_ПКО.Ссылка,
       |    НД_ПКО.Дата,
       |    НД_ПКО.Подразделение
       |ИЗ
       |    Документ.НД_ПКО КАК НД_ПКО
       |ГДЕ
       |    НД_ПКО.Дата = &Дата
       |    И НД_ПКО.Подразделение = &Подразделение";

   Запрос.УстановитьПараметр("Дата", ЭтотОбъект.Дата);
   Запрос.УстановитьПараметр("Подразделение", ТекПодразделение);
   Результат = Запрос.Выполнить().Выгрузить();
   Если Результат.Количество()>0 тогда
       Сообщить("В базе уже имеется документ ПКО по выбранному подразделению на указанную дату ("+Строка(Результат[0].Ссылка)+"). Чтобы перезагрузить данные предварительно удалите старый документ")
   Иначе;
       ТзДляПКО=Тз.Скопировать();
       ТзДляПКО.Свернуть("Доктор","Сумма");
       //Создаем документ ПКО
       ДокументПКО=Документы.НД_ПКО.СоздатьДокумент();
       ДокументПКО.Дата=ЭтотОбъект.Дата;
       ДокументПКО.ВидОперации=Справочники.ВидыОпераций.НД_ПКО_ПоступлениеОтПокупателей;
       ДокументПКО.ВалютнаяСуммаДокумента=ТзДляПКО.Итог("Сумма");
       ДокументПКО.СуммаДокумента=ТзДляПКО.Итог("Сумма");
       ДокументПКО.Валюта=Справочники.Валюты.НайтиПоКоду("643");
       ДокументПКО.Учреждение=Справочники.Организации.НайтиПоКоду("С0001 ");
       ДокументПКО.СчетКассы=ПланыСчетов.ЕПСБУ.Касса;
       ДокументПКО.Подразделение=ТекПодразделение;
       ДокументПКО.ПодразделениеИз=ТекПодразделение;
       ДокументПКО.ЦелевоеНазначение=Справочники.НД_ЦелевыеНазначения.НайтиПоКоду("00000017 ");
       ДокументПКО.Основание="Выручка за медицинские услуги";
       Отбор=Новый Структура("ВидОтветственногоЛица",Перечисления.ОтветственныеЛицаОрганизаций.ГлавныйБухгалтер);
       ДокументПКО.глБухгалтер=РегистрыСведений.ОтветственныеЛицаУчреждений.ПолучитьПоследнее(ЭтотОбъект.Дата,Отбор).ОтветственноеЛицо;
       Отбор=Новый Структура("ВидОтветственногоЛица",Перечисления.ОтветственныеЛицаОрганизаций.Кассир);
       ДокументПКО.Кассир=РегистрыСведений.ОтветственныеЛицаУчреждений.ПолучитьПоследнее(ЭтотОбъект.Дата,Отбор).ОтветственноеЛицо;
       //х=1/0;
       Для каждого ТекСтрока из ТзДляПКО цикл
           НоваяСтрока=ДокументПКО.СтрокиДокумента.Добавить();
           НоваяСтрока.КВД=Перечисления.КВД.Внебюджет;
           Запрос = Новый Запрос;
           Запрос.Текст =
               "ВЫБРАТЬ
               |    КБК.Ссылка,
               |    КБК.НаименованиеПолное
               |ИЗ
               |    Справочник.КБК КАК КБК
               |ГДЕ
               |    КБК.НаименованиеПолное = ""Доходы от продажи услуг""";

           Результат = Запрос.Выполнить().Выгрузить();
       
           НоваяСтрока.КБКназначения=Результат[0].Ссылка;
             НоваяСтрока.КОСГУназначения=Справочники.КОСГУ.НайтиПоКоду("130");
             НоваяСтрока.СубконтоСчетКассы2=Справочники.Субконто.НайтиПоКоду("Выручка за мед. услуги");
           НоваяСтрока.КБКСчетКредита=НоваяСтрока.КБКназначения;
           НоваяСтрока.СчетКредита=ПланыСчетов.ЕПСБУ.РасчетыСПлательщикамиДоходовОтУслуг;
           НоваяСтрока.КОСГУСчетКредита=Справочники.КОСГУ.НайтиПоКоду("660");
           НоваяСтрока.СубконтоСчетКредита2=ТекСтрока.Доктор;
           НоваяСтрока.СубконтоСчетКассы2=Справочники.Субконто.НайтиПоКоду("149                 ");
           Запрос = Новый Запрос;
           Запрос.Текст =
               "ВЫБРАТЬ
               |    Договоры.Ссылка,
               |    Договоры.Наименование
               |ИЗ
               |    Справочник.Договоры КАК Договоры
               |ГДЕ
               |    Договоры.Контрагент = &Контрагент
               |    И Договоры.Наименование = ""Услуги платные""";

           Запрос.УстановитьПараметр("Контрагент", ТекСтрока.Доктор);
           Результат=Запрос.Выполнить().Выгрузить();
           Если Результат.Количество()>0 тогда
               НоваяСтрока.СубконтоСчетКредита3=Результат[0].Ссылка;
           Иначе
               Сообщить("Документ ""ПКО"": Не удалось заполнить субконто 3кт по врачу "+Строка(ТекСтрока.Доктор));
           КонецЕсли;    
           
           
           НоваяСтрока.ВалютнаяСумма=ТекСтрока.Сумма;
           НоваяСтрока.КОСГУСчетКассы=Справочники.КОСГУ.НайтиПоКоду("510");
           
           Запрос = Новый Запрос;
           Запрос.Текст =
               "ВЫБРАТЬ
               |    КБК.Ссылка,
               |    КБК.НаименованиеПолное
               |ИЗ
               |    Справочник.КБК КАК КБК
               |ГДЕ
               |    КБК.НаименованиеПолное = ""внутреннее финанс.-е""";

           Результат = Запрос.Выполнить().Выгрузить();
           НоваяСтрока.КБКСчетКассы=Результат[0].Ссылка;

           НоваяСтрока.Сумма=ТекСтрока.Сумма;
       КонецЦикла;
       ДокументПКО.Записать(РежимЗаписиДокумента.Запись);
       Сообщить("Создан документ "+Строка(ДокументПКО.Ссылка)+" от "+Строка(ДокументПКО.Дата));
   КонецЕсли;
   
   //Добавим Документ "Операция"
   
   ДокументОперация=Документы.ОперацияБух.СоздатьДокумент();
   ДокументОперация.Учреждение=ДокументПКО.Учреждение;
   ДокументОперация.СуммаОперации=ДокументПКО.СуммаДокумента;
   ДокументОперация.ДатаПервичногоДокумента=ДокументПКО.Дата;
   ДокументОперация.НомерПервичногоДокумента=ДокументПКО.Номер;
   ДокументОперация.ВидПервичногоДокумента=Строка(ДокументПКО.Ссылка);
   ДокументОперация.Дата=ЭтотОбъект.Дата;
   
   Для каждого ТекСтрока из Тз цикл
       НоваяСтрока=ДокументОперация.Движения.ЕПСБУ.Добавить();
       НоваяСтрока.КВД=Перечисления.КВД.Внебюджет;
       НоваяСтрока.Учреждение=ДокументПКО.Учреждение;
               
       Запрос = Новый Запрос;
       Запрос.Текст =
           "ВЫБРАТЬ
           |    КБК.Ссылка,
           |    КБК.НаименованиеПолное
           |ИЗ
           |    Справочник.КБК КАК КБК
           |ГДЕ
           |    КБК.НаименованиеПолное = ""Доходы от продажи услуг""";

       Результат = Запрос.Выполнить().Выгрузить();
       НоваяСтрока.КБКДт=Результат[0].Ссылка;
       НоваяСтрока.КБККт=Результат[0].Ссылка;
       НоваяСтрока.СчетДт=ПланыСчетов.ЕПСБУ.РасчетыСПлательщикамиДоходовОтУслуг;
       НоваяСтрока.СчетКт=ПланыСчетов.ЕПСБУ.ДоходыТекущегоГода;
       НоваяСтрока.Активность=Истина;
       НоваяСтрока.Период=ЭтотОбъект.Дата;
       НоваяСтрока.ВалютаДт=Справочники.Валюты.НайтиПоКоду("643");
       НоваяСтрока.Сумма=ТекСтрока.Сумма;
       НоваяСтрока.ВалютнаяСуммаДт=ТекСтрока.Сумма;
       НоваяСтрока.НомерЖурнала=Справочники.Журналы.НайтиПоКоду("5     ");
       НоваяСтрока.НомерПервичногоДокумента=ДокументПКО.Номер;
       НоваяСтрока.ДатаПервичногоДокумента=ДокументПКО.Дата;
       НоваяСтрока.ВидПервичногоДокумента=Строка(ДокументПКО.Ссылка);
       НоваяСтрока.СубконтоДт.КОСГУ=Справочники.КОСГУ.НайтиПоКоду("560");
       НоваяСтрока.СубконтоДт.Контрагенты=ТекСтрока.Доктор;
       Запрос = Новый Запрос;
       Запрос.Текст =
           "ВЫБРАТЬ
           |    Договоры.Ссылка,
           |    Договоры.Наименование
           |ИЗ
           |    Справочник.Договоры КАК Договоры
           |ГДЕ
           |    Договоры.Контрагент = &Контрагент
           |    И Договоры.Наименование = ""Услуги платные""";

       Запрос.УстановитьПараметр("Контрагент", ТекСтрока.Доктор);
       Результат=Запрос.Выполнить().Выгрузить();
       Если Результат.Количество()>0 тогда
           НоваяСтрока.СубконтоДт.Договоры=Результат[0].Ссылка;
       Иначе
           Сообщить("Документ ""Операция"": Не удалось заполнить субконто 3кт по врачу "+Строка(ТекСтрока.Доктор));
       КонецЕсли;
       
       НоваяСтрока.СубконтоКт.КОСГУ=Справочники.КОСГУ.НайтиПоКоду("130");
       НоваяСтрока.СубконтоКт.Контрагенты=ТекСтрока.Доктор;
       Запрос = Новый Запрос;
       Запрос.Текст =
           "ВЫБРАТЬ
           |    Договоры.Ссылка,
           |    Договоры.Наименование,
           |    Договоры.КраткоеСодержание
           |ИЗ
           |    Справочник.Договоры КАК Договоры
           |ГДЕ
           |    Договоры.Контрагент = &Контрагент
           |    И Договоры.Наименование <> ""Услуги платные""";

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

       Запрос = Новый Запрос;
       Запрос.Текст ="ВЫБРАТЬ    NULL КАК Поле1";

       Результат = Запрос.Выполнить().Выгрузить();

   КонецЦикла;
   //Значение поля дата не может быть пустой
   ДокументОперация.ПолучитьФорму().Открыть();
   //ДокументОперация.Записать(РежимЗаписиДокумента.Запись);
   Сообщить("Создан документ "+Строка(ДокументОперация.Ссылка)+" от "+Строка(ДокументОперация.Дата));
       
КонецПроцедуры
8 KizerSoze
 
08.10.12
19:20
bodik911, Субконто совпадают. Я их перевыбирал - не помогло
9 vmv
 
08.10.12
19:23
проверять субконто по каждой записи проводки относительно счетов Д/К если его там нет на 1,2,3... писать Неопределено, если есть ПривестиЗначение()
10 vmv
 
08.10.12
19:24
по фик что все данные зваполнил, тебе же написало "Вид субконто "Контрагенты" не доступен для данной записи"

т.е. перепутал тип субконто у проводки либо подписчик делает свои блоки на допустимые типы аналитики при опредленных условиях, копай
11 Snorkler
 
08.10.12
19:33
(8) Счета (Дт и Кт с их субконто), на которых вываливается ошибка, в студию…
12 KizerSoze
 
08.10.12
19:39
Субконто заполнены правильно,
Про "подписчик делает свои блоки на допустимые типы аналитики при опредленных условиях" - не понятно. Где это проверить?
Я паралельно запускал отладку ручного и программного документа - все процедуры в модуле формы, модуле объекта и в модуле набора записей срабатывали полностью.

Счет Дт:205.31 субконто1-Кэк, субконто2-Контрагенты, субконто3-Договоры.
Счет Кт:401.10 субконто1-Кэк.
13 Snorkler
 
08.10.12
19:56
(12) И как согласуется

>>Счет Кт:401.10 субконто1-Кэк.

И


       Если Результат.Количество()=1 тогда
           НоваяСтрока.СубконтоКт.Договоры=Результат[0].Ссылка;
           //Сообщить("Успех");

       ИначеЕсли Результат.Количество()=0 тогда
           Сообщить("Не удалось заполнить субконто ""Договора"" по врачу "+Строка(ТекСтрока.Доктор));
       ИначеЕсли Результат.Количество()>1 тогда    
           Сообщить("В базе имеется несколько договоров с врачом "+Строка(ТекСтрока.Доктор)+". Необходимо вручную заполнить субконто ""Договора"" по по этому сотруднику в документе ""Операция""");
       КонецЕсли;



Таки договор или КЭК?
14 KizerSoze
 
08.10.12
20:11
Кэк.
Этот фрагмент не откоректирован (я менял в свое время аналитику счета 401.10)

При отладке срабатывает вариант
ИначеЕсли Результат.Количество()=0 тогда
Сообщить("Не удалось заполнить субконто ""Договора"" по врачу "+Строка(ТекСтрока.Доктор));

Я закомментировал этот фрагмент, на результат это не оказало никакого влияния (только сообщения перестали выскакивать).
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший