По теме из базы знаний
- Запуск COM-Объекта 1С 7.7 или 1С 8.х в виде "УДАЛЕННОГО COM+" (как Решение проблемы запуска COM 32-бит внутри 64-бит приложения, так и проблем разных версий движка 8.х)
- 7 причин, почему интеграцию необходимо строить на очередях. Практика RabbitMQ. Отказ от Zato ESB и OData в 1С
- Обмен через универсальный формат. Пример нестандартной конвертации данных
- РусскийФокс и BootStrap
- Сказ о том, как в одной крупной компании документооборот внедряли, или проблемы типовых обменов между КА и ДО
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
ЛС.Fields("nomer").Value Это числовое значение из ДБФ-ника, существование данной записи проверяется ранее вот полный код процедуры: НачатьТранзакцию();
стрПодключения = "Driver={Microsoft Visual FoxPro Driver};
|SourceType=DBF;SourceDB=D:\Наст;
|Exclusive=No ;NULL=NO; BackgroundFetch=Yes;";
Connect = Новый COMОбъект("ADODB.Connection");
попытка
Connect.Open(стрПодключения);
исключение
сообщить(ОписаниеОшибки());
Отказ=Истина;
Возврат;
КонецПопытки;
ЛС = Новый COMОбъект("ADODB.Recordset");
ЛС.Open("Sel ect CPCONVERT(866,1251,kod) as kod,nomer,CPCONVERT(866,1251,name) as ima,nkv,CPCONVERT(866,1251,lkv) as lkv fr om sprls2", Connect);
Пока ЛС.EOF()=0 цикл
РезультатПоиска = Справочники.ЛицевыеСчета.НайтиПоКоду(ЛС.Fields("nomer").Value);
Если РезультатПоиска = 0 Тогда
НовыйЛицевойСчет = Справочники.ЛицевыеСчета.СоздатьЭлемент();
НовыйЛицевойСчет.Код = ЛС.Fields("nomer").Value;
НовыйЛицевойСчет.Номер = ЛС.Fields("nomer").Value;
НовыйЛицевойСчет.Квартиросьемщик =ЛС.Fields("ima").Value;
НовыйЛицевойСчет.Квартира = ЛС.Fields("nkv").Value;
НовыйЛицевойСчет.ЛитераКвартиры = ЛС.Fields("lkv").Value;
НовыйЛицевойСчет.Владелец =Справочники.ДОМА.НайтиПоКоду(ЛС.Fields("kod").Value).
НовыйЛицевойСчет.Записать();
Иначе Результат = Справочники.ЛицевыеСчета.НайтиПоКоду(ЛС.Fields("nomer").Value).Квартиросъемщик;
Если Не Результат = ЛС.Fields("ima").Value Тогда
Лицевой = Справочники.ЛицевыеСчета.НайтиПоКоду(ЛС.Fields("nomer").Value).Ссылка.ПолучитьОбъект();
Лицевой.Квартиросъемщик = ЛС.Fields("ima").Value;
Лицевой.Записать();
КонецЕсли;
КонецЕсли;
ЛС.MoveNext();
КонецЦикла;
ЛС.Close();
Connect.Close();
ЗафиксироватьТранзакцию();
стрПодключения = "Driver={Microsoft Visual FoxPro Driver};
|SourceType=DBF;SourceDB=D:\Наст;
|Exclusive=No ;NULL=NO; BackgroundFetch=Yes;";
Connect = Новый COMОбъект("ADODB.Connection");
попытка
Connect.Open(стрПодключения);
исключение
сообщить(ОписаниеОшибки());
Отказ=Истина;
Возврат;
КонецПопытки;
ЛС = Новый COMОбъект("ADODB.Recordset");
ЛС.Open("Sel ect CPCONVERT(866,1251,kod) as kod,nomer,CPCONVERT(866,1251,name) as ima,nkv,CPCONVERT(866,1251,lkv) as lkv fr om sprls2", Connect);
Пока ЛС.EOF()=0 цикл
РезультатПоиска = Справочники.ЛицевыеСчета.НайтиПоКоду(ЛС.Fields("nomer").Value);
Если РезультатПоиска = 0 Тогда
НовыйЛицевойСчет = Справочники.ЛицевыеСчета.СоздатьЭлемент();
НовыйЛицевойСчет.Код = ЛС.Fields("nomer").Value;
НовыйЛицевойСчет.Номер = ЛС.Fields("nomer").Value;
НовыйЛицевойСчет.Квартиросьемщик =ЛС.Fields("ima").Value;
НовыйЛицевойСчет.Квартира = ЛС.Fields("nkv").Value;
НовыйЛицевойСчет.ЛитераКвартиры = ЛС.Fields("lkv").Value;
НовыйЛицевойСчет.Владелец =Справочники.ДОМА.НайтиПоКоду(ЛС.Fields("kod").Value).
НовыйЛицевойСчет.Записать();
Иначе Результат = Справочники.ЛицевыеСчета.НайтиПоКоду(ЛС.Fields("nomer").Value).Квартиросъемщик;
Если Не Результат = ЛС.Fields("ima").Value Тогда
Лицевой = Справочники.ЛицевыеСчета.НайтиПоКоду(ЛС.Fields("nomer").Value).Ссылка.ПолучитьОбъект();
Лицевой.Квартиросъемщик = ЛС.Fields("ima").Value;
Лицевой.Записать();
КонецЕсли;
КонецЕсли;
ЛС.MoveNext();
КонецЦикла;
ЛС.Close();
Connect.Close();
ЗафиксироватьТранзакцию();
Просто, как бы когда я выставил условие Иначе Результат = Справочники.ЛицевыеСчета.НайтиПоКоду(ЛС.Fields("nomer").Value) И Справочники.ЛицевыеСчета.НайтиПоРеквизиту("Квартиросьемщик" ...._ мне выдало о том, что не может сравнивать с булево... Ну да не суть, подскажите тогда вот еще что:
НачатьТранзакцию();
стрПодключения = "Driver={Microsoft Visual FoxPro Driver};
|SourceType=DBF;SourceDB=D:\Наст;
|Exclusive=No ;NULL=NO; BackgroundFetch=No;";
Connect = Новый COMОбъект("ADODB.Connection");
попытка
Connect.Open(стрПодключения);
исключение
сообщить(ОписаниеОшибки());
Отказ=Истина;
Возврат;
КонецПопытки;
ДОМ = Новый COMОбъект("ADODB.Recordset");
ДОМ.Open("Sel ect CPCONVERT(866,1251,kod) as kod, nom,CPCONVERT(866,1251,lit) as lit, CPCONVERT(866,1251,ul) as ul, drobnom, CPCONVERT(866,1251,droblit) as droblit, kolkv, kolet, kolpd, kolst, ima fr om sprdom", Connect);
Пока ДОМ.EOF()=0 цикл
РезультатПоиска = Справочники.ДОМА.НайтиПоКоду(ДОМ.Fields("kod").Value, 0);
Если РезультатПоиска = Неопределено ИЛИ РезультатПоиска.Пустая() Тогда
НовыйДома = Справочники.Дома.СоздатьЭлемент();
НовыйДома.Код = ДОМ.Fields("kod").Value;
НовыйДома.Номер =ДОМ.Fields("nom").Value;
НовыйДома.Владелец =Справочники.Улицы.НайтиПоНаименованию(ДОМ.Fields("ul").Value).Ссылка;
НовыйДома.Литера = ДОМ.Fields("lit").Value;
НовыйДома.ДробьНомер = ДОМ.Fields("drobnom").Value;
НовыйДома.ДробьЛитера = ДОМ.Fields("droblit").Value;
НовыйДома.Квартир = ДОМ.Fields("kolkv").Value;
НовыйДома.Этажность = ДОМ.Fields("kolet").Value;
НовыйДома.Подъездов = ДОМ.Fields("kolpd").Value;
НовыйДома.Стояков = ДОМ.Fields("kolst").Value;
НовыйДома.Имя = ДОМ.Fields("ima").Value;
НовыйДома.Записать();
КонецЕсли;
ДОМ.MoveNext();
КонецЦикла;
ДОМ.Close();
Connect.Close();
ЗафиксироватьТранзакцию();
Останавливается на ошибке: {Обработка.СинхронизацияБазы.Форма.Форма.Форма(103)}: Ошибка при вызове метода контекста (Записать)
НовыйДома.Записать();
по причине:
Значение поля "Владелец" не заполнено или заполнено неверно
И я не могу понять это от того, что у меня нет улицы или все же есть ошибка?
НачатьТранзакцию();
стрПодключения = "Driver={Microsoft Visual FoxPro Driver};
|SourceType=DBF;SourceDB=D:\Наст;
|Exclusive=No ;NULL=NO; BackgroundFetch=No;";
Connect = Новый COMОбъект("ADODB.Connection");
попытка
Connect.Open(стрПодключения);
исключение
сообщить(ОписаниеОшибки());
Отказ=Истина;
Возврат;
КонецПопытки;
ДОМ = Новый COMОбъект("ADODB.Recordset");
ДОМ.Open("Sel ect CPCONVERT(866,1251,kod) as kod, nom,CPCONVERT(866,1251,lit) as lit, CPCONVERT(866,1251,ul) as ul, drobnom, CPCONVERT(866,1251,droblit) as droblit, kolkv, kolet, kolpd, kolst, ima fr om sprdom", Connect);
Пока ДОМ.EOF()=0 цикл
РезультатПоиска = Справочники.ДОМА.НайтиПоКоду(ДОМ.Fields("kod").Value, 0);
Если РезультатПоиска = Неопределено ИЛИ РезультатПоиска.Пустая() Тогда
НовыйДома = Справочники.Дома.СоздатьЭлемент();
НовыйДома.Код = ДОМ.Fields("kod").Value;
НовыйДома.Номер =ДОМ.Fields("nom").Value;
НовыйДома.Владелец =Справочники.Улицы.НайтиПоНаименованию(ДОМ.Fields("ul").Value).Ссылка;
НовыйДома.Литера = ДОМ.Fields("lit").Value;
НовыйДома.ДробьНомер = ДОМ.Fields("drobnom").Value;
НовыйДома.ДробьЛитера = ДОМ.Fields("droblit").Value;
НовыйДома.Квартир = ДОМ.Fields("kolkv").Value;
НовыйДома.Этажность = ДОМ.Fields("kolet").Value;
НовыйДома.Подъездов = ДОМ.Fields("kolpd").Value;
НовыйДома.Стояков = ДОМ.Fields("kolst").Value;
НовыйДома.Имя = ДОМ.Fields("ima").Value;
НовыйДома.Записать();
КонецЕсли;
ДОМ.MoveNext();
КонецЦикла;
ДОМ.Close();
Connect.Close();
ЗафиксироватьТранзакцию();
Останавливается на ошибке: {Обработка.СинхронизацияБазы.Форма.Форма.Форма(103)}: Ошибка при вызове метода контекста (Записать)
НовыйДома.Записать();
по причине:
Значение поля "Владелец" не заполнено или заполнено неверно
И я не могу понять это от того, что у меня нет улицы или все же есть ошибка?
(13) JaroslavBayev, по отладчику:
1. В конфигураторе поставьте курсор на строке
2. Выберите в меню "Отладка" - "Остановка по ошибке". Поставьте флажок "Останавливаться по ошибке"
3. Запустите отладку по "F5"
4. Запустите в режиме предприятие выполнение вашего кода.
5. В конфигураторе должна сработать остановка отладки на строке с кодом выше.
6. Выделите "ЛС.Fields("nomer").Value" мышью и нашмите "Shift+F9". 1c попытается рассчитать выделенное выражение и показать его. Там же можно пробовать править текст чтобы добиться нужного значения. Которое потом перенести в код.
Если в "ЛС.Fields("nomer").Value" содержится число (например 5) а код в 1с строка вида "00005" используйте функцию Формат() для получения нужного вида кода. Примерно так:
получите "00005"
Как-то так. Спрашивайте если что.
1. В конфигураторе поставьте курсор на строке
Лицевой = Справочники.ЛицевыеСчета.НайтиПоКоду(ЛС.Fields("nomer").Value).Ссылка.ПолучитьОбъект();
2. Выберите в меню "Отладка" - "Остановка по ошибке". Поставьте флажок "Останавливаться по ошибке"
3. Запустите отладку по "F5"
4. Запустите в режиме предприятие выполнение вашего кода.
5. В конфигураторе должна сработать остановка отладки на строке с кодом выше.
6. Выделите "ЛС.Fields("nomer").Value" мышью и нашмите "Shift+F9". 1c попытается рассчитать выделенное выражение и показать его. Там же можно пробовать править текст чтобы добиться нужного значения. Которое потом перенести в код.
Если в "ЛС.Fields("nomer").Value" содержится число (например 5) а код в 1с строка вида "00005" используйте функцию Формат() для получения нужного вида кода. Примерно так:
Формат(ЛС.Fields("nomer").Value, "ЧЦ=6; ЧВН=; ЧГ=")
Как-то так. Спрашивайте если что.
Как-то где-то я так и не понял... Я прошелся по обновлению двух предидущих справочников, а вот с домами беда... Вопрос не может это быть связано с тем, что и этот справочник является владельцем другого и у этого справочника есть владелец?
(16) SuhoffGV, В том-то и дело, что у я пытаюсь как раз получить ссылку на владельца... Переделал эту строку в НовыйДома.Владелец = Справочники.Улицы.НайтиПоКоду(ДОМ.Fields("unom").Value,0).Ссылка; Код в справочнике Улицы строка и unom тоже текстовый, запустил отладчик так как вы сказали, к стати за это вам отдельное спасибо, очень удобный инструмент, и получаю результат: {(1)}: Ошибка при вызове метода контекста (НайтиПоКоду) честно говоря, что не так не пойму....
(17) JaroslavBayev,
здесь все более-менее понятно. Булево - это ИСТИНА либо ЛОЖЬ, а никак не 0. Если справочник подчиненный, то обязательно нужен Владелец.
НайтиПоКоду(<Код>, <ПоискПоПолномуКоду>, <Родитель>, <Владелец>)
<Код> (обязательный)
Тип: Число; Строка.
Искомый код.
Строка или число в зависимости от настроек справочника в конфигураторе.
<ПоискПоПолномуКоду> (необязательный)
Тип: Булево.
Определяет режим поиска по полному коду. Истина - искомый код следует задавать в виде строки, состоящей из последовательности кодов по уровням справочника, разделенных символом "/".
Значение по умолчанию: Ложь
<Родитель> (необязательный)
Тип: СправочникСсылка.
Родитель, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
<Владелец> (необязательный)
Тип: СправочникСсылка.
Владелец, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
Показать<Код> (обязательный)
Тип: Число; Строка.
Искомый код.
Строка или число в зависимости от настроек справочника в конфигураторе.
<ПоискПоПолномуКоду> (необязательный)
Тип: Булево.
Определяет режим поиска по полному коду. Истина - искомый код следует задавать в виде строки, состоящей из последовательности кодов по уровням справочника, разделенных символом "/".
Значение по умолчанию: Ложь
<Родитель> (необязательный)
Тип: СправочникСсылка.
Родитель, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
<Владелец> (необязательный)
Тип: СправочникСсылка.
Владелец, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
здесь все более-менее понятно. Булево - это ИСТИНА либо ЛОЖЬ, а никак не 0. Если справочник подчиненный, то обязательно нужен Владелец.
(18) starjevschik, что-то мне сдается, что все проще - мне нужно искать по полному соответствию, а так я нахожу не одну ссылку... Т.к. поле текстовое и в ощибку я выпадаю при UNOM = 65, а в справочнике есть код и 1 065, и 165, и т.д... Вот как задать это самое уточнение полное соответствие....
(19) JaroslavBayev, поиск всегда точный. И находит он всегда одну ссылку, или ни одной. Здесь не очень спорить, так устроено. Если справочник подчиненный и коды в пределах подчинения, то может найтись чужой элемент, но он все равно будет один.
Вообще вопрос не стоит выеденного яйца, чесслово. Разбирательств с отладчиком минуты на три. Может, так и сделать? :)
Вообще вопрос не стоит выеденного яйца, чесслово. Разбирательств с отладчиком минуты на три. Может, так и сделать? :)
(21) starjevschik, Дак вот тут незадача... В режиме отладки стою на данной строке,которая выглядит так НовыйДома.Владелец = Справочники.Улицы.НайтиПоКоду(ДОМ.Fields("unom").Value); результат вроде адекватный, т.е получаю справочникссылка.улицы, а далее сказка - есть все значения но при прогонке до конца снова ответ:Значение Поля Владелец не заполнено или заполнено не верно...
(23) JaroslavBayev, А вы часом не новый велосипед загрузку КЛАДР-а пишете?
Что значит "при прогонке до конца"? В какой строке ошибка и смотрите что там в данных/переменных? В конце концов посмотрите сами глазами есть ли то что вы ищете в справочнике.
(19) Писал выше. Какой длины код в Справочники.Улицы? Используйте функцию . 6 - длина кода в примере, вам нужно подставить свою из свойств справочника.
Добавьте обработчик ошибки в случае если нет искомого элемента. Тогда без отладчика увидите что 1с не может найти:
Что значит "при прогонке до конца"? В какой строке ошибка и смотрите что там в данных/переменных? В конце концов посмотрите сами глазами есть ли то что вы ищете в справочнике.
(19) Писал выше. Какой длины код в Справочники.Улицы? Используйте функцию
Формат(ЛС.Fields("nomer").Value, "ЧЦ=6; ЧВН=; ЧГ=")
Добавьте обработчик ошибки в случае если нет искомого элемента. Тогда без отладчика увидите что 1с не может найти:
ИскомыйКод = ДОМ.Fields("unom").Value;
ИскомыйВладелец = Справочники.Улицы.НайтиПоКоду(ИскомыйКод).Ссылка;
Если ИскомыйВладалец = Неопределено тогда
Сообщить("Не найдена улица с кодом:"+ИскомыйКод);
возврат;
Иначе
НовыйДома.Владелец = Справочники.Улицы.НайтиПоКоду(ДОМ.Fields("unom").Value,0).Ссылка;
КонецЕсли;
Показать
(25) SuhoffGV, Увы нет, все печальнее у нас на фирма стоит старая еще ДОС задача и вот ее до конца года будем переносить на 1С, а данные из старой и пока рабочей задачи нужны в 1С сейчас приходится выкручиваться и пытаться синхронизироваться...
По поводу есть ли в справочнике, есть, точно есть...
По поводу есть ли в справочнике, есть, точно есть...
Процедура СинхронизироватьДома()
НачатьТранзакцию();
стрПодключения = "Driver={Microsoft Visual FoxPro Driver};
|SourceType=DBF;SourceDB=D:\Наст;
|Exclusive=No ;NULL=NO; BackgroundFetch=No;";
Connect = Новый COMОбъект("ADODB.Connection");
попытка
Connect.Open(стрПодключения);
исключение
сообщить(ОписаниеОшибки());
Отказ=Истина;
Возврат;
КонецПопытки;
ДОМ = Новый COMОбъект("ADODB.Recordset");
ДОМ.Open("Sel ect CPCONVERT(866,1251,kod) as kod, nom,CPCONVERT(866,1251,lit) as lit,CPCONVERT(866,1251,unom)as unom,drobnom, CPCONVERT(866,1251,droblit) as droblit, kolkv, kolet, kolpd, kolst, ima fr om sprdom", Connect);
Пока ДОМ.EOF()=0 цикл
РезультатПоиска = Справочники.ДОМА.НайтиПоКоду(ДОМ.Fields("kod").Value, 0);
Если РезультатПоиска = Неопределено ИЛИ РезультатПоиска.Пустая() ИЛИ РезультатПоиска = 0 Тогда
НовыйДома = Справочники.Дома.СоздатьЭлемент();
НовыйДома.Код = ДОМ.Fields("kod").Value;
НовыйДома.Номер =ДОМ.Fields("nom").Value;
ИскомыйКод = ДОМ.Fields("unom").Value;
ИскомыйВладелец = Справочники.Улицы.НайтиПоКоду(ДОМ.Fields("unom").Value).Ссылка;
Если ИскомыйВладелец = Неопределено тогда
Сообщить("Не найдена улица с кодом:"+ИскомыйКод);
возврат;
Иначе
НовыйДома.Владелец = ИскомыйВладелец;
КонецЕсли;
НовыйДома.Литера = ДОМ.Fields("lit").Value;
НовыйДома.ДробьНомер = ДОМ.Fields("drobnom").Value;
НовыйДома.ДробьЛитера = ДОМ.Fields("droblit").Value;
НовыйДома.Квартир = ДОМ.Fields("kolkv").Value;
НовыйДома.Этажность = ДОМ.Fields("kolet").Value;
НовыйДома.Подъездов = ДОМ.Fields("kolpd").Value;
НовыйДома.Стояков = ДОМ.Fields("kolst").Value;
НовыйДома.Имя = ДОМ.Fields("ima").Value;
НовыйДома.Записать();
КонецЕсли;
ДОМ.MoveNext();
КонецЦикла;
ДОМ.Close();
Connect.Close();
ЗафиксироватьТранзакцию();
КонецПроцедуры
НачатьТранзакцию();
стрПодключения = "Driver={Microsoft Visual FoxPro Driver};
|SourceType=DBF;SourceDB=D:\Наст;
|Exclusive=No ;NULL=NO; BackgroundFetch=No;";
Connect = Новый COMОбъект("ADODB.Connection");
попытка
Connect.Open(стрПодключения);
исключение
сообщить(ОписаниеОшибки());
Отказ=Истина;
Возврат;
КонецПопытки;
ДОМ = Новый COMОбъект("ADODB.Recordset");
ДОМ.Open("Sel ect CPCONVERT(866,1251,kod) as kod, nom,CPCONVERT(866,1251,lit) as lit,CPCONVERT(866,1251,unom)as unom,drobnom, CPCONVERT(866,1251,droblit) as droblit, kolkv, kolet, kolpd, kolst, ima fr om sprdom", Connect);
Пока ДОМ.EOF()=0 цикл
РезультатПоиска = Справочники.ДОМА.НайтиПоКоду(ДОМ.Fields("kod").Value, 0);
Если РезультатПоиска = Неопределено ИЛИ РезультатПоиска.Пустая() ИЛИ РезультатПоиска = 0 Тогда
НовыйДома = Справочники.Дома.СоздатьЭлемент();
НовыйДома.Код = ДОМ.Fields("kod").Value;
НовыйДома.Номер =ДОМ.Fields("nom").Value;
ИскомыйКод = ДОМ.Fields("unom").Value;
ИскомыйВладелец = Справочники.Улицы.НайтиПоКоду(ДОМ.Fields("unom").Value).Ссылка;
Если ИскомыйВладелец = Неопределено тогда
Сообщить("Не найдена улица с кодом:"+ИскомыйКод);
возврат;
Иначе
НовыйДома.Владелец = ИскомыйВладелец;
КонецЕсли;
НовыйДома.Литера = ДОМ.Fields("lit").Value;
НовыйДома.ДробьНомер = ДОМ.Fields("drobnom").Value;
НовыйДома.ДробьЛитера = ДОМ.Fields("droblit").Value;
НовыйДома.Квартир = ДОМ.Fields("kolkv").Value;
НовыйДома.Этажность = ДОМ.Fields("kolet").Value;
НовыйДома.Подъездов = ДОМ.Fields("kolpd").Value;
НовыйДома.Стояков = ДОМ.Fields("kolst").Value;
НовыйДома.Имя = ДОМ.Fields("ima").Value;
НовыйДома.Записать();
КонецЕсли;
ДОМ.MoveNext();
КонецЦикла;
ДОМ.Close();
Connect.Close();
ЗафиксироватьТранзакцию();
КонецПроцедуры
(28) JaroslavBayev, как-то так наверное
исправлял только цикл
Процедура СинхронизироватьДома()
НачатьТранзакцию();
стрПодключения = "Driver={Microsoft Visual FoxPro Driver};
|SourceType=DBF;SourceDB=D:\Наст;
|Exclusive=No ;NULL=NO; BackgroundFetch=No;";
Connect = Новый COMОбъект("ADODB.Connection");
попытка
Connect.Open(стрПодключения);
исключение
сообщить(ОписаниеОшибки());
Отказ=Истина;
Возврат;
КонецПопытки;
ДОМ = Новый COMОбъект("ADODB.Recordset");
ДОМ.Open("Sel ect CPCONVERT(866,1251,kod) as kod, nom,CPCONVERT(866,1251,lit) as lit,CPCONVERT(866,1251,unom)as unom,drobnom, CPCONVERT(866,1251,droblit) as droblit, kolkv, kolet, kolpd, kolst, ima fr om sprdom", Connect);
Пока ДОМ.EOF()=0 цикл
ИскомыйКодУлицы = ДОМ.Fields("unom").Value;
Если ПустаяСтрока(ИскомыйКодУлицы) Тогда
Сообщить("Не найден код улицы!");
Возврат;
КонецЕсли;
ИскомыйВладелец = Справочники.Улицы.НайтиПоКоду(ИскомыйКодУлицы);
Если ИскомыйВладелец.Пустая() Тогда
Сообщить("Не найден владелец!");
КонецЕсли;
ИскомыйКодДома = ДОМ.Fields("kod").Value;
Если ПустаяСтрока(ИскомыйКодДома) Тогда
Сообщить("Не найден код дома!");
Возврат;
КонецЕсли;
РезультатПоиска = Справочники.ДОМА.НайтиПоКоду(ИскомыйКодДома, Истина,,ИскомыйВладелец);
Если РезультатПоиска.Пустая() Тогда
НовыйДома = Справочники.Дома.СоздатьЭлемент();
НовыйДома.Код = ИскомыйКодДома;
НовыйДома.Номер =ДОМ.Fields("nom").Value;
ИскомыйКод = ДОМ.Fields("unom").Value;
НовыйДома.Владелец = ИскомыйВладелец;
НовыйДома.Литера = ДОМ.Fields("lit").Value;
овыйДома.ДробьНомер = ДОМ.Fields("drobnom").Value;
НовыйДома.ДробьЛитера = ДОМ.Fields("droblit").Value;
НовыйДома.Квартир = ДОМ.Fields("kolkv").Value;
НовыйДома.Этажность = ДОМ.Fields("kolet").Value;
овыйДома.Подъездов = ДОМ.Fields("kolpd").Value;
НовыйДома.Стояков = ДОМ.Fields("kolst").Value;
НовыйДома.Имя = ДОМ.Fields("ima").Value;
НовыйДома.Записать();
Иначе
Сообщить("Дом существует в справочнике");
КонецЕсли;
ДОМ.MoveNext();
КонецЦикла;
ДОМ.Close();
Connect.Close();
ЗафиксироватьТранзакцию();
КонецПроцедуры
Показатьисправлял только цикл
Отказ=Истина; - лишнее. Тут он не к чему.
замените на
перенесите перед
А сразу после цикла.
Но это все некритичные моменты.
вставляйте код в теги кода (Alt+p) так он читается на форуме лучше.
Улицы точно являются владельцем для Дома?
Если РезультатПоиска = Неопределено ИЛИ РезультатПоиска.Пустая() ИЛИ РезультатПоиска = 0 Тогда
замените на
Если РезультатПоиска.Пустая()
НачатьТранзакцию();
перенесите перед
Пока ДОМ.EOF()=0 цикл
А
ЗафиксироватьТранзакцию();
Но это все некритичные моменты.
вставляйте код в теги кода (Alt+p) так он читается на форуме лучше.
Улицы точно являются владельцем для Дома?
Т.е мне нужно получить код Города и строка запроса должна выглядеть как
ИскомыйКодУлицы = КодГорода+"/"+ДОМ.Fields("unom").Value;
Если ПустаяСтрока(ИскомыйКодУлицы) Тогда
Сообщить("Не найден код улицы!");
Возврат;
КонецЕсли;
ИскомыйВладелец = Справочники.Улицы.НайтиПоКоду(ИскомыйКодУлицы);
Если ИскомыйВладелец.Пустая() Тогда
Сообщить("Не найден владелец!");
КонецЕсли;
ИскомыйКодДома = ДОМ.Fields("kod").Value;
Если ПустаяСтрока(ИскомыйКодДома) Тогда
Сообщить("Не найден код дома!");
Возврат;
КонецЕсли;
Показать
Писал в свое время обработку для переноса данных по расчету квартплаты из досовой задачи:
Процедура ЗагрузкаУлиц()
НомерПП = 0;
СписокУлицDBF = Новый XBASE; //создаем ссылку на файл DBF
СписокУлицDBF.ОткрытьФайл(КаталогБазы + "\" + "ULICA.dbf"); //открываем файл на диске
СписокУлицDBF.Кодировка = КодировкаXBase.OEM;
Если СписокУлицDBF.Открыта()=0 Тогда //проверяем, удалось ли открыть файл
Сообщить("Не удалось открыть файл!");
Иначе
СписокУлицDBF.Первая(); //позиционируемся на первой записи
Пока СписокУлицDBF.ВКонце()=0 Цикл //пока не дошли до конца, крутим цикл
НомерПП = НомерПП + 1;
Состояние("Обрабатывается запись " + НомерПП + "/" + СписокУлицDBF.КоличествоЗаписей());
ЭлементСправочникаУлиц = Справочники.ркУлицы.НайтиПоКоду(СписокУлицDBF.KOD);
Если ЭлементСправочникаУлиц = Справочники.ркУлицы.ПустаяСсылка() Тогда
ЭлементСправочникаУлиц = Справочники.ркУлицы.СоздатьЭлемент();
Сообщить("Улица " + СписокУлицDBF.NAZVANIE + " не найдена, создаем");
Иначе
Сообщить("Улица " + СписокУлицDBF.NAZVANIE + " найдена, корректируем");
ЭлементСправочникаУлиц = ЭлементСправочникаУлиц.ПолучитьОбъект();
КонецЕсли;
ЭлементСправочникаУлиц.Код = СокрЛП(СписокУлицDBF.KOD);
ЭлементСправочникаУлиц.Наименование = СокрЛП(СписокУлицDBF.NAZVANIE);
ЭлементСправочникаУлиц.Записать();
СписокУлицDBF.Следующая(); //переходим на следующую запись
КонецЦикла;
СписокУлицDBF.ЗакрытьФайл(); //не забывайте пожалуйста
КонецЕсли;
КонецПроцедуры
Показать
Процедура ЗагрузкаДомов()
НомерПП = 0;
СписокДомовDBF = Новый XBASE; //создаем ссылку на файл DBF
СписокДомовDBF.ОткрытьФайл(КаталогБазы + "\" + "DOM.DBF"); //открываем файл на диске
СписокДомовDBF.Кодировка = КодировкаXBase.OEM;
Если СписокДомовDBF.Открыта()=0 Тогда //проверяем, удалось ли открыть файл
Сообщить("Не удалось открыть файл!");
Иначе
СписокДомовDBF.Первая(); //позиционируемся на первой записи
Пока СписокДомовDBF.ВКонце()=0 Цикл //пока не дошли до конца, крутим цикл
НомерПП = НомерПП + 1;
Состояние("Обрабатывается запись " + НомерПП + "/" + СписокДомовDBF.КоличествоЗаписей());
ЭлементСправочникаДомов = Справочники.ркДома.НайтиПоКоду(СокрЛП(СписокДомовDBF.KOD));
Если ЭлементСправочникаДомов = Справочники.ркДома.ПустаяСсылка() Тогда
ЭлементСправочникаДомов = Справочники.ркДома.СоздатьЭлемент();
Сообщить("Дом " + СокрЛП(СписокДомовDBF.NAZVANIE) + " не найден, создаем");
Иначе
Сообщить("Дом " + СокрЛП(СписокДомовDBF.NAZVANIE) + " найден, корректируем");
ЭлементСправочникаДомов = ЭлементСправочникаДомов.ПолучитьОбъект();
КонецЕсли;
//ЭлементСправочникаДомов. = СписокДомовDBF.;
ЭлементСправочникаДомов.Код = СокрЛП(СписокДомовDBF.KOD);
ЭлементСправочникаДомов.Наименование = СокрЛП(СписокДомовDBF.NAZVANIE);
Улица = Справочники.ркУлицы.НайтиПоКоду(СокрЛП(СписокДомовDBF.ULICA));
Если Улица = Справочники.ркУлицы.ПустаяСсылка()
Тогда
Сообщить ("Улица не найдена, подставляем К.Либкнехта код (50)");
Улица = Справочники.ркУлицы.НайтиПоКоду("50");
КонецЕсли;
ЭлементСправочникаДомов.Владелец = Улица ;
Корпус = Сред(СокрЛП(СписокДомовDBF.DOM), СтрДлина(СокрЛП(СписокДомовDBF.DOM)), 1);
Если Найти("0123456789", Корпус) >0
Тогда
ЭлементСправочникаДомов.Номер = СокрЛП(СписокДомовDBF.DOM);
Иначе
ЭлементСправочникаДомов.Номер = Сред(СокрЛП(СписокДомовDBF.DOM), 1, СтрДлина(СокрЛП(СписокДомовDBF.DOM))-1);
ЭлементСправочникаДомов.Корпус = Корпус;
КонецЕсли;
ЭлементСправочникаДомов.Записать();
СписокДомовDBF.Следующая(); //переходим на следующую запись
КонецЦикла;
СписокДомовDBF.ЗакрытьФайл(); //не забывайте пожалуйста
КонецЕсли;
КонецПроцедуры
Показать
И это уже печально, послушав ваших советов вставил в код:
И в результате оказывается, что здесь я и населенный пункт найти по коду не могу все та-же ошибка....
ИскомыйКод = Дом.Fields("kodul").Value;
Населенный = Справочники.НаселенныеПункты.НайтиПоКоду(""+Дом.Fields("kodnp").Value);
Улица = Справочники.Улицы.НайтиПоКоду(""+Дом.Fields("kodul"),Истина,,Населенный);
ИскомыйВладелец = Улица;
Если ИскомыйВладелец = Неопределено ИЛИ ИскомыйВладелец.Пустая() тогда
Сообщить("Не найдена улица с кодом:"+ИскомыйКод);
возврат;
Иначе
НовыйДома.Владелец = ИскомыйВладелец;
КонецЕсли;
НовыйДома.Литера = ДОМ.Fields("lit").Value;
НовыйДома.ДробьНомер = ДОМ.Fields("drobnom").Value;
ПоказатьИ в результате оказывается, что здесь я и населенный пункт найти по коду не могу все та-же ошибка....
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот