[РЕШЕНО] Выгрузка з/п ведомостей в Сбербанк в формате .dbf из 1С8.2 ЗиКБУ

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем 0x0tnik87, 7 мар 2013.

  1. TopicStarter Overlay
    0x0tnik87
    Offline

    0x0tnik87 Опытный в 1С

    Регистрация:
    28 сен 2012
    Сообщения:
    117
    Симпатии:
    5
    Баллы:
    29
    Приветствую! :icon_avatar-174:
    Имея на платформе 1С:Предприятие 8.2 (8.2.17.153) конфу "1С:Медицина.Зарплата и кадры бюджетного учреждения" редакция 1.0 (1.0.51.1) успешно использовал внешнюю обработку для выгрузки зарплатных ведомостей в сбербанк в формате .dbf , а затем редактировал данные из .dbf в .csv(разделители и запятые). (см.рис 1 в архиве.)

    После обновления и перехода на 1.0.52.1 при выгрузке - появилась ошибка (см.рис 2)

    {Форма.Форма.Форма(66)}: Метод объекта не обнаружен (РазложитьСтрокуВМассивПодстрок)
    M = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Стр.Физлицо,".");
    Посмотреть вложение 14012

    При включенной отладке тыкает носом в ниже приведенный кусок кода (жЫрным шрифтом выделил):
    .................................................................................................


    Процедура КнопкаВыполнитьНажатие(Кнопка)
    ДБ = Новый Xbase;
    ДБ.Кодировка = КодировкаXBase.OEM;
    ДБ.Поля.Добавить("A","S",30,);
    ДБ.Поля.Добавить("B","S",30,);
    ДБ.Поля.Добавить("C","S",30,);
    ДБ.Поля.Добавить("D","S",30,);
    ДБ.Поля.Добавить("E","S",30,);
    ДБ.Поля.Добавить("F","S",30,);
    ДБ.Поля.Добавить("G","S",30,);
    ДБ.СоздатьФайл("C:\"+N+".dbf",);
    ДБ.АвтоСохранение =1;

    ДБ.Добавить();
    ДБ.A = "0279";
    ДБ.Записать();

    ДБ.Добавить();
    ДБ.A = "К платежному поручению №";
    ДБ.B = НОМПЛАТ;
    ДБ.C = "От";
    ДБ.D = ДАТАПЛАТ;
    ДБ.Записать();

    ДБ.Добавить();
    ДБ.A = "Зачисление";
    ДБ.B = "01";
    ДБ.Записать();

    ДБ.Добавить();
    ДБ.A = "Наименование,(ОГРН),№банкСчета";
    ДБ.B = "МБУЗ Кежемская ЦРБ,";
    ДБ.C = "40204810300000000881";
    ДБ.Записать();

    ДБ.Добавить();
    ДБ.A = "По договору:";
    ДБ.B = "31041040";
    ДБ.C = "От";
    ДБ.D = "08.07.2008";
    ДБ.Записать();

    ДБ.Добавить();
    ДБ.A = "№ п/п";
    ДБ.B = "Номер счета";
    ДБ.C = "Фамилия";
    ДБ.D = "Имя";
    ДБ.E = "Отчество";
    ДБ.F = "Сумма";
    ДБ.Записать();
    СУМ = 0;
    НОМР= 1;

    Для Каждого Стр из Док.Зарплата цикл
    ДБ.Добавить();

    Выборка = РегистрыСведений.ЛицевыеСчетаРаботниковОрганизации.Выбрать();
    Пока Выборка.Следующий() Цикл
    Если Выборка.Физлицо.СтраховойНомерПФР = Стр.Физлицо.СтраховойНомерПФР Тогда
    ДБ.B = Выборка.НомерЛицевогоСчета;
    КонецЕсли;
    КонецЦикла;

    ДБ.A = НОМР;
    M = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Стр.Физлицо,".");
    ДБ.C = ВРег(M[0]);
    ДБ.D = ВРег(M[1]);
    Попытка
    ДБ.E = ВРег(M[2]); //Если у человека нет отчества - заменяем его пустой строкой
    Исключение
    ДБ.E = "";
    Конецпопытки;
    K = Формат(Стр.Сумма, "ЧГ=0"); //Убираем пробел-разделитель между тысячными
    ДБ.F =СтрЗаменить(K,",","."); //Заменяем разделитель "," на точку
    НОМР = НОМР+1;
    Сум = Сум + Стр.Сумма;
    Сообщить(Стр.Физлицо);
    КонецЦикла;

    ДБ.Добавить();
    ДБ.B = "ИТОГО:";

    Сум = Формат(Сум, "ЧГ=0");
    Сум =СтрЗаменить(Сум,",",".");

    ДБ.F = Сум;
    ДБ.Записать();
    ДБ.ЗакрытьФайл();
    Сообщить("Выгрузка завершена");


    КонецПроцедуры
    ---------------------------------------------------------------------------------------
    заранее спс если кто отредактирует код или поможет советом.

    Вложения:

  2. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Из Общего модуля убрали эту процедуру. Либо скопируйте ее в свою обработку, либо найдите в какой общем модуле сейчас находится эта обработка и подкорректируйте
    <Найденный модуль>.РазложитьСтрокуВМассивПодстрок(Стр.Физлицо,".");
  3. TopicStarter Overlay
    0x0tnik87
    Offline

    0x0tnik87 Опытный в 1С

    Регистрация:
    28 сен 2012
    Сообщения:
    117
    Симпатии:
    5
    Баллы:
    29
    каким образом быстрее всего найти в каком модуле сейчас моя обработка?

    по названию обработки, или по коду или по процедурам?
    я начал с Общие-/Общие модули-/Общего назначения-/...там функции и процедуры, как бы поиск грамотнее организовать?
  4. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Запустите глобальный поиск в конфигурации по слову и посмотрите в каком сейчас модуле
    РазложитьСтрокуВМассивПодстроки
  5. TopicStarter Overlay
    0x0tnik87
    Offline

    0x0tnik87 Опытный в 1С

    Регистрация:
    28 сен 2012
    Сообщения:
    117
    Симпатии:
    5
    Баллы:
    29
    Единственное что нашел с помощью глобального поиска: - Общие/Общие модули/Общего назначения/Вспомогательные процедуры и функции/Выполнить экспортную процедуру по имени/...
    ================================================================================================================
    Процедура ВыполнитьБезопасно(ИмяЭкспортнойПроцедуры, Параметры = Неопределено, ОбластьДанных = Неопределено) Экспорт

    // Проверка предусловий на формат ИмяЭкспортнойПроцедуры.
    ЧастиИмени = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяЭкспортнойПроцедуры, ".");
    Если ЧастиИмени.Количество() <> 2 И ЧастиИмени.Количество() <> 3 Тогда
    ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
    НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1)'"),
    ИмяЭкспортнойПроцедуры);
    КонецЕсли;

    ИмяОбъекта = ЧастиИмени[0];
    Если ЧастиИмени.Количество() = 2 И Метаданные.ОбщиеМодули.Найти(ИмяОбъекта) = Неопределено Тогда
    ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
    НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1)'"),
    ИмяЭкспортнойПроцедуры);
    КонецЕсли;

    Если ЧастиИмени.Количество() = 3 Тогда
    ДопустимыеИменаТипов = Новый Массив;
    ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаКонстанты()));
    ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаРегистрыСведений()));
    ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаРегистрыНакопления()));
    ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаРегистрыБухгалтерии()));
    ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаРегистрыРасчета()));
    ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаСправочники()));
    ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаДокументы()));
    ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаОтчеты()));
    ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаОбработки()));
    ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаБизнесПроцессы()));
    ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаЖурналыДокументов()));
    ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаЗадачи()));
    ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаПланыСчетов()));
    ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаПланыОбмена()));
    ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаПланыВидовХарактеристик()));
    ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаПланыВидовРасчета()));
    ИмяТипа = ВРег(ЧастиИмени[0]);
    Если ДопустимыеИменаТипов.Найти(ИмяТипа) = Неопределено Тогда
    ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
    НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1)'"),
    ИмяЭкспортнойПроцедуры);
    КонецЕсли;
    КонецЕсли;

    ИмяМетода = ЧастиИмени[ЧастиИмени.ВГраница()];
    ВременнаяСтруктура = Новый Структура;
    Попытка
    // Проверка на то, что ИмяМетода является допустимым идентификатором.
    // Например: МояПроцедура
    ВременнаяСтруктура.Вставить(ИмяМетода);
    Исключение
    ЗаписьЖурналаРегистрации(НСтр("ru = 'Безопасное выполнение метода'"), УровеньЖурналаРегистрации.Ошибка, , ,
    ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
    НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1)'"),
    ИмяЭкспортнойПроцедуры);
    КонецПопытки;

    ПараметрыСтрока = "";
    Если Параметры <> Неопределено И Параметры.Количество() > 0 Тогда
    Для Индекс = 0 По Параметры.ВГраница() Цикл
    ПараметрыСтрока = ПараметрыСтрока + "Параметры[" + Индекс + "],";
    КонецЦикла;
    ПараметрыСтрока = Сред(ПараметрыСтрока, 1, СтрДлина(ПараметрыСтрока) - 1);
    КонецЕсли;

    Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда
    Если Не ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() Тогда
    Если ОбластьДанных = Неопределено Тогда
    ОбластьДанных = ЗначениеРазделителяСеанса();
    Иначе
    Если ОбластьДанных <> ЗначениеРазделителяСеанса() Тогда
    ВызватьИсключение(НСтр("ru = 'В данном сеансе недопустимо обращение к данным из другой области данных!'"));
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    Если ОбластьДанных <> Неопределено
    И (НЕ ИспользованиеРазделителяСеанса() ИЛИ ОбластьДанных <> ЗначениеРазделителяСеанса()) Тогда
    УстановитьРазделениеСеанса(Истина, ОбластьДанных);
    КонецЕсли;
    КонецЕсли;

    Выполнить ИмяЭкспортнойПроцедуры + "(" + ПараметрыСтрока + ")";

    КонецПроцедуры
  6. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Ну и, напишите в обработке СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Стр.Физлицо,".");
  7. TopicStarter Overlay
    0x0tnik87
    Offline

    0x0tnik87 Опытный в 1С

    Регистрация:
    28 сен 2012
    Сообщения:
    117
    Симпатии:
    5
    Баллы:
    29
    Изменил. Выдает ошибку что Индекс находится за границами массива...

    получается что сейчас обработка находится в том же модуле где и была раньше. В --Общие/Общие модули/Общего назначения/...
    Что на что менять тогда?
  8. mialord
    Offline

    mialord Модераторы Команда форума Модератор

    Регистрация:
    31 июл 2009
    Сообщения:
    5.398
    Симпатии:
    40
    Баллы:
    54
    Она теперь находится не в модуле общего назначения, а в модуле СтроковыеФункцииКлиентСервер.
    Тогда откройте конфу до обновления и скопируйте её оттуда в свою обработку
  9. TopicStarter Overlay
    0x0tnik87
    Offline

    0x0tnik87 Опытный в 1С

    Регистрация:
    28 сен 2012
    Сообщения:
    117
    Симпатии:
    5
    Баллы:
    29
    Заменил строку, нашел ошибку свою - СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Стр.Физлицо,"."); - в скобках после физлицо - точку заменил на пробел! Все выгружается как раньше теперь.

    Спасибо большое дружище за помощь еще раз.

Поделиться этой страницей