Консультация № 94120
06.07.2007, 07:29
0.00 руб.
0 6 6
Доброе время суток!
У меня такой вопрос. 1С 77. Конф. ЗиК сетевая. 4 пользователя.
Есть отчет. На форме отчета Таблица значений.
Пользователь сохраняет Таблицу при помощи функции СохранитьЗначение().
Потом при повторном открытии восстанавливает ТЗ функцией ВосстановитьЗначение().
Проблема в том, что другой пользователь не может восстановить таблицу (1 забил данный, сохранил; 2 открыл отчет - ТЗ пустая)
Пробовал сохранять-восстанавливать функциями ЗначениеВФайл() ЗначениеИзФайла() выдает ошибку "Ваше приложение .... будет закрыто... и т.д."
Может есть какие-то другие варианты?
Заранее благодарю. Виталий.

Обсуждение

Неизвестный
06.07.2007, 07:41
общий
это ответ
Здравствуйте, _vit9791!
Вариант с СохранитьЗначение() и ВосстановитьЗначение() не работает поскольку настройка сохраняется только для текущего пользователя, другой пользователь не может открыть эту же настройку. Но можно скопировать файл настройки (*.prm) в каталог нужного пользователя.
Также вместо ЗначениеВФайл() ЗначениеИзФайла() можно сохранять значения ТЗ в DBF таблицу.
Удачи!
Неизвестный
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); Возврат; КонецЕсли; КонтекстВызвавшейФормы = Форма.Параметр;КонецПроцедурыПроцедура Выполнить() КонтекстВызвавшейФормы.Комментарий = ВыбФайлЗагрузки;КонецПроцедуры
Неизвестный
06.07.2007, 11:15
общий
это ответ
Здравствуйте, _vit9791!
у меня такая ошибка вываливается при попытке использования формата в функции значениевфайл(), без этого параметра все нормально отрабатывает.
Неизвестный
06.07.2007, 11:30
общий
это ответ
Здравствуйте, _vit9791!

Вообще ЗначениеВФайл() - действенный метод для сохранения значений между пользователями (в отличии от СохранитьЗначение(), которое распространяется только на одного пользователя). Необходимо разбираться, почему вылетает ошибка. Может, имеется попытка пропихнуть ему в имени файла недопустимое значение, или еще чего-нибудь. Если можно, подробнее опишите момент возникновения ошибки (в плане, возникает ли она при сохранении, восстановлении, или в обоих случаях), и саму процедурку неплохо бы увидеть, так как у меня ЗначениеВФайл() прекрасно сохраняет ТЗ в файл. И точно также хорошо можно восстановить.
Неизвестный
06.07.2007, 13:23
общий
это ответ
Здравствуйте, _vit9791!

Перед выгрузкой в файл, можно преобразовать таблицу в строку функцией <b>ЗначениеВСтроку()</b>, после чего записать хоть в текстовый файл, хоть той же процедурой ЗначениеВФайл() воспользоваться. Обратное преобразование -- <b>ЗначениеИзСтроки()</b>.
Неизвестный
06.07.2007, 19:25
общий
это ответ
Здравствуйте, _vit9791!
СохранитьЗначение и ВосстановитьЗначение - привязанны к конкретному пользователю 1С. Поэтому другой пользователь видит пустую ТЗ. Самым правильным решением, на мой взгляд, будет обработка данных в ручную. Сохранять и восстанавливать данные, например, из текстового файла. Придется добавить пару кнопочек для этого. Если вы хотите чтобы не всем пользователям эта таблица заполнялась, то можно выкрутиться дополнительным флажком на форме. А вот с ним работать уже через механизм сохранения и восстановления значений.
Форма ответа