И так приступим.
Для дальнейшей работы с материалом, представленным в данной публикации будем считать что вы обладаете следующими навыками:
- создание пустой пустой информационной базы из cf файла;
- установки обновлений;
- администрирование конфигурации.
Так как целью данной публикации не является обучение пользователей данным навыкам, подробно раскрывать данные моменты не буду.
Я решил выложить два способа решения:
- самостоятельная подготовка исправления. Предназначен для тех, кто имеет навыки по администрированию конфигураций.
- установка готового обновления. Предназначен для тех, кто не имеет навыков по администрированию конфигураций, но очень хочет установить обновление.
Скачиваем приложенный файл обновления. Затем устанавливаем обновление типовой конфигурации. Следом устанавливаем обновление из приложенного файла. Запускаем пользовательский режим и радуемся сообщению об успешном окончании установки обновления.
Создаем базу из cf файла типовой конфигурации релиза 1.0.57.4. Снимаем конфигурацию с "замочка". Переходим в модуль объекта обработки ЗаполнениеКорректныхКорреспонденцийСчетов и заменяем весь модуль на следующий код:
//////////////////////////////////////////////////////////////////////////////
// ПРОЧИЕ ПРОЦЕДУРЫ И ФУНКЦИИ
Функция НайтиСчетПоКодуИзКэша(КодСчета, СоответствиеКэш)
Если (СоответствиеКэш = Неопределено) Тогда
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ЕПСБУ.Ссылка,
| ЕПСБУ.Код,
| ЕПСБУ.ДатаНачала
|ИЗ
| ПланСчетов.ЕПСБУ КАК ЕПСБУ");
Выборка = Запрос.Выполнить().Выбрать();
СоответствиеКэш = Новый Соответствие;
Пока Выборка.Следующий() Цикл
СоответствиеКэш.Вставить(БухгалтерскийУчет.Представление_Счет_Дата(Выборка.Код, Выборка.ДатаНачала), Выборка.Ссылка);
КонецЦикла;
КонецЕсли;
Результат = СоответствиеКэш.Получить(КодСчета);
Если (Результат = Неопределено) Тогда
Результат = ПланыСчетов.ЕПСБУ.ПустаяСсылка();
КонецЕсли;
Возврат Результат;
КонецФункции
//////////////////////////////////////////////////////////////////////////////
// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
// Заполняет данными регистр сведений КорректныеКорреспонденцииСчетов
//
// Параметры:
// УдалитьВсеСуществующие - Булево. Если Истина, то все существующие записи регистра
// будут удалены перед заполнением
// ПолноеИмяФайла - Строка. Если не указано, то проводки берутся из шаблона
// ОтображатьПрогресс - Булево. Надо ли отображать диалог с прогресс баром. Закрыть эту форму должна
// будет вызывающая функция
//
// Возвращает Истина, если файлы успешно загружены
//
Функция ЗаполнитьПроводки(УдалитьВсеСуществующие, ПолноеИмяФайла,
ЗаполненоПроводок = 0, ОтображатьПрогресс = Ложь) Экспорт
ЗаполненоПроводок = 0;
СоответствиеСчетДт = Новый Соответствие;
НаборЗаписей = РегистрыСведений.КорректныеКорреспонденцииСчетов.СоздатьНаборЗаписей();
СоответствиеКэш = Неопределено;
Если Не(УдалитьВсеСуществующие) Тогда
Запрос = Новый Запрос(
"ВЫБРАТЬ
| КорректныеКорреспонденцииСчетов.СчетДт,
| КорректныеКорреспонденцииСчетов.СчетКт,
| КорректныеКорреспонденцииСчетов.Комментарий
|ИЗ
| РегистрСведений.КорректныеКорреспонденцииСчетов КАК КорректныеКорреспонденцииСчетов");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если (СоответствиеСчетДт[Выборка.СчетДт] = Неопределено) Тогда
СоответствиеСчетДт.Вставить(Выборка.СчетДт, Новый Соответствие);
КонецЕсли;
СоответствиеСчетДт[Выборка.СчетДт].Вставить(
Выборка.СчетКт, Выборка.Комментарий);
КонецЦикла;
КонецЕсли;
ИсточникМакет = ПустаяСтрока(ПолноеИмяФайла);
ЧтениеXML = Новый ЧтениеXML;
Если (ИсточникМакет) Тогда
Макет = РегистрыСведений.КорректныеКорреспонденцииСчетов.ПолучитьМакет("КорректныеКорреспонденции");
ЧтениеXML.УстановитьСтроку(Макет.ПолучитьТекст());
//<_ЦИТ <<>>
#Область Внесение_изменений
#Область Заполнение_соответствия_счетов
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЕПСБУ.Ссылка,
| ЕПСБУ.Код,
| ЕПСБУ.ДатаНачала
|ИЗ
| ПланСчетов.ЕПСБУ КАК ЕПСБУ";
ТЗ_Результат = Запрос.Выполнить().Выгрузить();
ТЗ_Результат.Колонки.Добавить("СчетХМЛ");
#Область Заполнаяем_счета_с_датой
ЧтениеXML.ПерейтиКСодержимому(); // FileContent
ЧтениеXML.ПрочитатьАтрибут(); // xmlns:nspxml
ЧтениеXML.ПрочитатьАтрибут(); // RecordCount
КоличествоСтрок = XMLЗначение(Тип("Число"), ЧтениеXML.Значение);
н = 0; // Это количесво просмотренных записей файла-источника
Пока (Истина) Цикл
Если (н >= КоличествоСтрок) Тогда
Прервать;
КонецЕсли;
Попытка
ЧтениеXML.Прочитать(); // <Record>
ЧтениеXML.Прочитать(); // <СчетДтКод>
ЧтениеXML.Прочитать();
ТекСчетДтСтрока = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </СчетДтКод>
ЧтениеXML.Прочитать(); // <СчетКтКод>
ЧтениеXML.Прочитать();
ТекСчетКтСтрока = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </СчетКтКод>
ЧтениеXML.Прочитать(); // <Комментарий>
ЧтениеXML.Прочитать();
ТекКомментарий = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </Комментарий>
ЧтениеXML.Прочитать(); // </Record>
мсвДанных = Новый Массив;
мсвДанных.Добавить(ТекСчетДтСтрока);
мсвДанных.Добавить(ТекСчетКтСтрока);
Для Каждого Элемент ИЗ мсвДанных Цикл
Если НЕ Найти(Элемент,"0101") = 0 Тогда
СтрКодСчета = Элемент;
СтрДатаСчета = Сред(СтрКодСчета,Найти(СтрКодСчета,":") + 1,8);
ДатаСчета = Дата(Число(Сред(СтрДатаСчета,1,4)),Число(Сред(СтрДатаСчета,5,2)),Число(Сред(СтрДатаСчета,7,2)));
КодСчета = СтрЗаменить(СтрКодСчета,":" + СтрДатаСчета,"");
НайденныеСтроки = ТЗ_Результат.НайтиСтроки(Новый Структура("Код,ДатаНачала,СчетХМЛ",КодСчета,ДатаСчета,Неопределено));
Для Каждого Строка ИЗ НайденныеСтроки Цикл Строка.СчетХМЛ = Элемент; КонецЦикла;
КонецЕсли;
КонецЦикла;
Исключение
Возврат Ложь;
КонецПопытки;
н = н + 1;
КонецЦикла;
#КонецОбласти // Заполнаяем_счета_с_датой
#Область Заполняем_счета_без_даты
ЧтениеXML.УстановитьСтроку(Макет.ПолучитьТекст());
ЧтениеXML.ПерейтиКСодержимому(); // FileContent
ЧтениеXML.ПрочитатьАтрибут(); // xmlns:nspxml
ЧтениеXML.ПрочитатьАтрибут(); // RecordCount
КоличествоСтрок = XMLЗначение(Тип("Число"), ЧтениеXML.Значение);
н = 0; // Это количесво просмотренных записей файла-источника
Пока (Истина) Цикл
Если (н >= КоличествоСтрок) Тогда
Прервать;
КонецЕсли;
Попытка
ЧтениеXML.Прочитать(); // <Record>
ЧтениеXML.Прочитать(); // <СчетДтКод>
ЧтениеXML.Прочитать();
ТекСчетДтСтрока = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </СчетДтКод>
ЧтениеXML.Прочитать(); // <СчетКтКод>
ЧтениеXML.Прочитать();
ТекСчетКтСтрока = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </СчетКтКод>
ЧтениеXML.Прочитать(); // <Комментарий>
ЧтениеXML.Прочитать();
ТекКомментарий = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </Комментарий>
ЧтениеXML.Прочитать(); // </Record>
мсвДанных = Новый Массив;
мсвДанных.Добавить(ТекСчетДтСтрока);
мсвДанных.Добавить(ТекСчетКтСтрока);
Для Каждого Элемент ИЗ мсвДанных Цикл
Если Найти(Элемент,"0101") = 0 Тогда
СтрКодСчета = Элемент;
КодСчета = СтрКодСчета;
НайденныеСтроки = ТЗ_Результат.НайтиСтроки(Новый Структура("Код,СчетХМЛ",КодСчета,Неопределено));
Для Каждого Строка ИЗ НайденныеСтроки Цикл Строка.СчетХМЛ = Элемент; КонецЦикла;
КонецЕсли;
КонецЦикла;
Исключение
Возврат Ложь;
КонецПопытки;
н = н + 1;
КонецЦикла;
#КонецОбласти // Заполняем_счета_без_даты
#КонецОбласти // Заполнение_соответствия_счетов
Если (ОтображатьПрогресс) Тогда
ФормаИндикации = ПолучитьОбщуюФорму("ХодВыполненияОбработкиДанных");
ФормаИндикации.НаименованиеОбработкиДанных = "Заполнение базы";
ФормаИндикации.КомментарийОбработкиДанных = "Заполнение регистра корректных корреспонденций";
ФормаИндикации.КомментарийЗначения = "Выполнено:";
ФормаИндикации.МаксимальноеЗначение = КоличествоСтрок;
ФормаИндикации.Значение = 0;
Если НЕ ФормаИндикации.Открыта() Тогда
ФормаИндикации.Открыть();
Конецесли;
КонецЕсли;
ЧтениеXML.УстановитьСтроку(Макет.ПолучитьТекст());
ЧтениеXML.ПерейтиКСодержимому(); // FileContent
ЧтениеXML.ПрочитатьАтрибут(); // xmlns:nspxml
ЧтениеXML.ПрочитатьАтрибут(); // RecordCount
н = 0; // Это количесво просмотренных записей файла-источника
Пока (Истина) Цикл
Если (н >= КоличествоСтрок) Тогда
Прервать;
КонецЕсли;
Попытка
ЧтениеXML.Прочитать(); // <Record>
ЧтениеXML.Прочитать(); // <СчетДтКод>
ЧтениеXML.Прочитать();
ТекСчетДтСтрока = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </СчетДтКод>
ЧтениеXML.Прочитать(); // <СчетКтКод>
ЧтениеXML.Прочитать();
ТекСчетКтСтрока = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </СчетКтКод>
ЧтениеXML.Прочитать(); // <Комментарий>
ЧтениеXML.Прочитать();
ТекКомментарий = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </Комментарий>
ЧтениеXML.Прочитать(); // </Record>
Исключение
Возврат Ложь;
КонецПопытки;
НайденныеСтрокиДт = ТЗ_Результат.НайтиСтроки(Новый Структура("СчетХМЛ",ТекСчетДтСтрока));
Если НайденныеСтрокиДт.Количество() = 0 Тогда
ОбщегоНазначения.СообщитьОбОшибке("Ошибка заполнения! Счет " + ТекСчетДтСтрока + " не найден");
н = н + 1;
Продолжить;
КонецЕсли;
ТекСчетДт = НайденныеСтрокиДт[0].Ссылка;
НайденныеСтрокиКт = ТЗ_Результат.НайтиСтроки(Новый Структура("СчетХМЛ",ТекСчетКтСтрока));
Если НайденныеСтрокиКт.Количество() = 0 Тогда
ОбщегоНазначения.СообщитьОбОшибке("Ошибка заполнения! Счет " + ТекСчетКтСтрока + " не найден");
н = н + 1;
Продолжить;
КонецЕсли;
ТекСчетКт = НайденныеСтрокиКт[0].Ссылка;
ДобавлятьЗапись = (УдалитьВсеСуществующие) Или
Не((СоответствиеСчетДт[ТекСчетДт] <> Неопределено) И
(СоответствиеСчетДт[ТекСчетДт].Получить(ТекСчетКт) <> Неопределено));
Если (ДобавлятьЗапись) Тогда
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.СчетДт = ТекСчетДт;
НоваяЗапись.СчетКт = ТекСчетКт;
НоваяЗапись.Комментарий = ТекКомментарий;
ЗаполненоПроводок = ЗаполненоПроводок + 1;
КонецЕсли;
Если (ОтображатьПрогресс) Тогда
ФормаИндикации.Значение = ФормаИндикации.Значение + 1;
КонецЕсли;
н = н + 1;
КонецЦикла;
ЧтениеXML.Закрыть();
НаборЗаписей.Записать(УдалитьВсеСуществующие);
Если (ОтображатьПрогресс) Тогда
Если ФормаИндикации.Открыта() Тогда
ФормаИндикации.Закрыть();
КонецЕсли;
КонецЕсли;
Возврат Истина;
#КонецОбласти // Внесение_изменений
//</_ЦИТ <<>>
Иначе
Попытка
ЧтениеXML.ОткрытьФайл(ПолноеИмяФайла);
Исключение
Возврат Ложь;
КонецПопытки;
КонецЕсли;
Попытка
ЧтениеXML.ПерейтиКСодержимому(); // FileContent
ЧтениеXML.ПрочитатьАтрибут(); // xmlns:nspxml
ЧтениеXML.ПрочитатьАтрибут(); // RecordCount
КоличествоСтрок = XMLЗначение(Тип("Число"), ЧтениеXML.Значение);
Исключение
Возврат Ложь;
КонецПопытки;
Если (ОтображатьПрогресс) Тогда
ФормаИндикации = ПолучитьОбщуюФорму("ХодВыполненияОбработкиДанных");
ФормаИндикации.НаименованиеОбработкиДанных = "Заполнение базы";
ФормаИндикации.КомментарийОбработкиДанных = "Заполнение регистра корректных корреспонденций";
ФормаИндикации.КомментарийЗначения = "Выполнено:";
ФормаИндикации.МаксимальноеЗначение = КоличествоСтрок;
ФормаИндикации.Значение = 0;
Если НЕ ФормаИндикации.Открыта() Тогда
ФормаИндикации.Открыть();
Конецесли;
КонецЕсли;
н = 0; // Это количесво просмотренных записей файла-источника
Пока (Истина) Цикл
Если (н >= КоличествоСтрок) Тогда
Прервать;
КонецЕсли;
Попытка
ЧтениеXML.Прочитать(); // <Record>
ЧтениеXML.Прочитать(); // <СчетДтКод>
ЧтениеXML.Прочитать();
ТекСчетДтСтрока = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </СчетДтКод>
ЧтениеXML.Прочитать(); // <СчетКтКод>
ЧтениеXML.Прочитать();
ТекСчетКтСтрока = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </СчетКтКод>
ЧтениеXML.Прочитать(); // <Комментарий>
ЧтениеXML.Прочитать();
ТекКомментарий = ЧтениеXML.Значение;
ЧтениеXML.Прочитать(); // </Комментарий>
ЧтениеXML.Прочитать(); // </Record>
Исключение
Возврат Ложь;
КонецПопытки;
ТекСчетДт = НайтиСчетПоКодуИзКэша(ТекСчетДтСтрока, СоответствиеКэш);
Если ТекСчетДт.Пустая() Тогда
ОбщегоНазначения.СообщитьОбОшибке("Ошибка заполнения! Счет " +
ТекСчетДтСтрока + " не найден");
КонецЕсли;
ТекСчетКт = НайтиСчетПоКодуИзКэша(ТекСчетКтСтрока, СоответствиеКэш);
Если ТекСчетКт.Пустая() Тогда
ОбщегоНазначения.СообщитьОбОшибке("Ошибка заполнения! Счет " +
ТекСчетКтСтрока + " не найден");
КонецЕсли;
ДобавлятьЗапись = (УдалитьВсеСуществующие) Или
Не((СоответствиеСчетДт[ТекСчетДт] <> Неопределено) И
(СоответствиеСчетДт[ТекСчетДт].Получить(ТекСчетКт) <> Неопределено));
Если (ДобавлятьЗапись) Тогда
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.СчетДт = ТекСчетДт;
НоваяЗапись.СчетКт = ТекСчетКт;
НоваяЗапись.Комментарий = ТекКомментарий;
ЗаполненоПроводок = ЗаполненоПроводок + 1;
КонецЕсли;
Если (ОтображатьПрогресс) Тогда
ФормаИндикации.Значение = ФормаИндикации.Значение + 1;
КонецЕсли;
н = н + 1;
КонецЦикла;
ЧтениеXML.Закрыть();
НаборЗаписей.Записать(УдалитьВсеСуществующие);
Возврат Истина;
КонецФункции
Сохраняем изменную конфигурацию. Готовим конфигурационный файл и радуемся результату.
Необходимо скачать файл БГУ 1.0.57.4: возврат к типовой конфигурации.cfu, далее его установить в качестве обновления. После внесения изменений данным обновлением установка обновления 1.0.58.2 происходит в автоматическом режиме.