Имя: Пароль:
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 тогда
Сообщить("Не удалось заполнить субконто ""Договора"" по врачу "+Строка(ТекСтрока.Доктор));

Я закомментировал этот фрагмент, на результат это не оказало никакого влияния (только сообщения перестали выскакивать).