06.07.2007, 07:59
общий
это ответ
Здравствуйте, _vit9791!
Вы пошли правильным путём - сохранять настройки в отдельный файл, чтобы другие пользователи могли его открыть. Я свою проблему решил так: ТаблицуЗначений построчно перегружаю в СписокЗначений, который и сохраняю в текстовый файл. При загрузке из файла проделываю всё в обратном порядке - из списка в ТЗ. У меня реализована выгрузка документа и используется обработка открытия файла. Имя файла для упрощения жизни продавцов формируется в комментарий документа при выгрузке/загрузке нового.
Приложение:
// Выгрузка и загрузка табличной части документа при "зависании" - начало// ===============================Процедура глВыгрузить(Конт) Экспорт Перем ТекСтрока; Перем Ном; Ном = 0; Текст = СоздатьОбъект("Текст"); Список= СоздатьОбъект("СписокЗначений"); Конт.ВыбратьСтроки(); Пока Конт.ПолучитьСтроку() = 1 Цикл ТекСтрока=""; Список.ДобавитьЗначение(Конт.Товар.Код); Список.ДобавитьЗначение(Конт.Товар.Наименование); Список.ДобавитьЗначение(Конт.Единица); Список.ДобавитьЗначение(Конт.Коэффициент); Список.ДобавитьЗначение(Конт.Количество); Список.ДобавитьЗначение(Конт.ЦенаБезНДС); Список.ДобавитьЗначение(Конт.ЦенаСНДС); Список.ДобавитьЗначение(Конт.СуммаБезНДС); Список.ДобавитьЗначение(Конт.СуммаСНДС); ТекСтрока = Список.ВСтрокуСРазделителями(); Текст.ДобавитьСтроку(ТекСтрока); Список.УдалитьВсе(); КонецЦикла; СтрокаФайла = КаталогИБ()+"сохранённые\выгрузка_"+Конт.ДатаДОк+"_"+Строка(Конт.ПредставлениеВида())+"_"+Конт.Автор+".txt"; Текст.Записать(СтрокаФайла);КонецПроцедуры //Выгрузить// ===============================// Описание: Поиск элемента справочникаФункция глНайтиЭлемент(ВидСправочника, Код = 0, Наименование = "") Экспорт Спр = СоздатьОбъект("Справочник." + ВидСправочника); текСтатусВозврата = 0; Если ПустаяСтрока(Наименование) = 1 Тогда текСтатусВозврата = Спр.НайтиПоКоду(Код, 0); ИначеЕсли Код = 0 Тогда текСтатусВозврата = Спр.НайтиПоНаименованию(Наименование, 0); КонецЕсли; Если текСтатусВозврата = 0 Тогда Сообщить("Не найден " + ВидСправочника + "по " + ?(ПустаяСтрока(Наименование) = 1, "коду " + код, " наименованию " + Наименование)); КонецЕсли; Возврат ?(текСтатусВозврата = 1, Спр.ТекущийЭлемент(), ПолучитьПустоеЗначение("Справочник." + ВидСправочника));КонецФункции // НайтиЭлемент()// ===============================Процедура глЗагрузить(Конт) Экспорт ОткрытьФормуМодально("Обработка.ВыборФайла",Конт); Текст = СоздатьОбъект("Текст"); Сп = СоздатьОбъект("СписокЗначений"); Текст.Открыть(Конт.Комментарий); тз = СоздатьОбъект("ТаблицаЗначений"); тз.НоваяКолонка("Товар", "Справочник.Номенклатура"); тз.НоваяКолонка("Единица", "Справочник.Единицы"); тз.НоваяКолонка("Коэффициент", "Число", 15,3); тз.НоваяКолонка("Количество", "Число", 15,3); тз.НоваяКолонка("ЦенаБезНДС", "Число", 15,4); тз.НоваяКолонка("ЦенаСНДС", "Число", 15,4); тз.НоваяКолонка("СуммаБезНДС", "Число", 15,4); тз.НоваяКолонка("СуммаСНДС", "Число", 15,4); НачатьТранзакцию(); ВсегоСтрок = Текст.КоличествоСтрок(); Если ВсегоСтрок = 0 Тогда Предупреждение("Текстовый файл оказался пустой!",3); СтатусВозврата(0); Возврат; КонецЕсли; Для Инд = 1 По Текст.КоличествоСтрок() Цикл ТекСтрока = Текст.ПолучитьСтроку(Инд); Сп.УдалитьВсе(); Сп.ИзСтрокиСРазделителями(ТекСтрока); тз.НоваяСтрока(); тз.Товар = глНайтиЭлемент("Номенклатура", Число(Сп.ПолучитьЗначение(1))); тз.Коэффициент = Число(Сп.ПолучитьЗначение(4)); тз.Количество = Число(Сп.ПолучитьЗначение(5)); тз.ЦенаБезНДС = Число(Сп.ПолучитьЗначение(6)); тз.ЦенаСНДС = Число(Сп.ПолучитьЗначение(7)); тз.СуммаБезНДС = Число(Сп.ПолучитьЗначение(8)); тз.СуммаСНДС = Число(Сп.ПолучитьЗначение(9)); КонецЦикла; тз.ВыбратьСтроку(); // записывание табличной части документа тз.ПолучитьСтрокуПоНомеру(1); текТовар = ""; //тз.ВыбратьСтроки(); Конт.УдалитьСтроки(); Пока тз.ПолучитьСтроку() = 1 Цикл Если ТекТовар <> тз.Товар Тогда ТекТовар = тз.Товар; // Добавить строку Конт.НоваяСтрока(); Конт.МестоХранения = ТекТовар.Склад; Конт.Товар = ТекТовар; Конт.Количество = тз.Количество; Конт.Единица = ТекТовар.ЕдиницаПоУмолчанию; Конт.Коэффициент = 1; Конт.ЦенаСНДС = тз.ЦенаСНДС; Конт.ЦенаБезНДС = тз.ЦенаБезНДС; Конт.СуммаСНДС = тз.СуммаСНДС; Конт.СуммаБезНДС = тз.СуммаБезНДС; КонецЕсли; КонецЦикла; Конт.Комментарий = 0; // Попытка записи Попытка Конт.Записать(); Исключение КонецПопытки; ЗафиксироватьТранзакцию();КонецПроцедуры //Загрузить// Выгрузка и загрузка табличной части документа при "зависании" - конец//// обработка открытия файлаПерем КонтекстВызвавшейФормы;// ===============================Функция ПолучитьКаталог(ВыбФайл) СтрКаталог = СокрЛП(ВыбФайл); ИсхСтр = СокрЛП(ВыбФайл); НовыйКаталог = ""; Если СтрЧислоВхождений(ИсхСтр, ".") = 0 Тогда Возврат ИсхСтр; КонецЕсли; Если СтрЧислоВхождений(СтрКаталог, "") > 0 Тогда Поз = Найти(СтрКаталог, ""); Пока Поз > 0 Цикл СтрКаталог = Прав(СтрКаталог, СтрДлина(СтрКаталог)-Поз); Поз2 = Найти(ИсхСтр, СтрКаталог); НовыйКаталог = Лев(ИсхСтр, Поз2-1); Поз = Найти(СтрКаталог, ""); КонецЦикла; КонецЕсли; Возврат НовыйКаталог;КонецФункции// ===============================Функция ВыборФайла(ВыбФайл, СтрЗаголовок, СтрПриглашение) Перем ПредстСпр; НовыйФайл = ""; НовыйКаталог = ПолучитьКаталог(ВыбФайл); Если НовыйКаталог = "" Тогда НовыйКаталог = ФС.ТекКаталог() КонецЕсли; Если ФС.ВыбратьФайл(0, НовыйФайл, НовыйКаталог, СтрЗаголовок, СтрПриглашение+"(*.txt)|*.txt|Все файлы(*.*)|*.*", "txt") = 1 Тогда ВыбФайл = НовыйКаталог+НовыйФайл; Возврат 1; КонецЕсли; Возврат 0;КонецФункции// ===============================Процедура ВыборФайлаЗагрузки(ВыбФайл) ВыборФайла(ВыбФайл, "Выберите файл для загрузки", "Файл для загрузки");КонецПроцедурыПроцедура ПриОткрытии() Если ПустоеЗначение(Форма.Параметр)=1 Тогда Предупреждение("Не указана переменная для открытия файла. Данная обработка запускается автоматически из других процедур конфигурации."); СтатусВозврата(0); Возврат; КонецЕсли; КонтекстВызвавшейФормы = Форма.Параметр;КонецПроцедурыПроцедура Выполнить() КонтекстВызвавшейФормы.Комментарий = ВыбФайлЗагрузки;КонецПроцедуры