|
Не получается записать программно заполненный документ "ОперацияБух" | ☑ | ||
---|---|---|---|---|
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 тогда Сообщить("Не удалось заполнить субконто ""Договора"" по врачу "+Строка(ТекСтрока.Доктор)); Я закомментировал этот фрагмент, на результат это не оказало никакого влияния (только сообщения перестали выскакивать). |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |