Имя: Пароль:
1C
 
Добавление записей в регистр сведений через список программно
0 falselight
 
14.12.17
10:42
Подскажите кому не трудно. Обычное приложение.
По кнопке из документа открывается список регистра сведений.
При добавлении в него записи, срабатывает процедура перед
добавлением:


Процедура РегистрСведенийСписокПередНачаломДобавления(Элемент, Отказ, Копирование)
    //
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    //
    Диалог.Заголовок                   = НСтр("ru = 'Выберите файл'");
    Диалог.ПолноеИмяФайла              = "";
    Диалог.МножественныйВыбор          = Ложь;
    Диалог.ПредварительныйПросмотр     = Ложь;
    Диалог.ПроверятьСуществованиеФайла = Истина;
    Диалог.Фильтр                      = "";
    Если Диалог.Выбрать() Тогда
        _Файл = Диалог.ПолноеИмяФайла;
    КонецЕсли;
    //
    НаборЗаписей                                    = РегистрыСведений.ФайлыОбъектов.СоздатьНаборЗаписей();
    //
    НоваяЗапись                                     = НаборЗаписей.Добавить();
    НоваяЗапись.ИмяОбъекта                          = Элемент.Значение.Отбор.ИмяОбъекта.Значение;
    НоваяЗапись.НомерФайла                             = НоваяЗапись.НомерФайла + 1;
    //НоваяЗапись.Файл                                =
    НоваяЗапись.ИмяФайла                            = ПолучитьИмяФайла(_Файл);
    НоваяЗапись.РасширениеФайла                     = ПРАВ(_Файл,3);
    НоваяЗапись.ПредставлениеФайла                  = _Файл;
    //
    НаборЗаписей.Записать();
КонецПроцедуры



Ресурс Файл регистра сведений типа хранилище значений, как в него
правильно поместить файл?
1 1Сергей
 
14.12.17
10:46
Гуглофобия?
2 falselight
 
14.12.17
10:47
Так идет ошибка, подскажите как правильно?


Процедура РегистрСведенийСписокПередНачаломДобавления(Элемент, Отказ, Копирование)
    //
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    //
    Диалог.Заголовок                   = НСтр("ru = 'Выберите файл'");
    Диалог.ПолноеИмяФайла              = "";
    Диалог.МножественныйВыбор          = Ложь;
    Диалог.ПредварительныйПросмотр     = Ложь;
    Диалог.ПроверятьСуществованиеФайла = Истина;
    Диалог.Фильтр                      = "";
    Если Диалог.Выбрать() Тогда
        _Файл = Диалог.ПолноеИмяФайла;
    КонецЕсли;
    //
    НаборЗаписей                                    = РегистрыСведений.ФайлыОбъектов.СоздатьНаборЗаписей();
    //
    НоваяЗапись                                     = НаборЗаписей.Добавить();
    НоваяЗапись.ИмяОбъекта                          = Элемент.Значение.Отбор.ИмяОбъекта.Значение;
    НоваяЗапись.НомерФайла                             = НоваяЗапись.НомерФайла + 1;
    //
    Файл                                               = Новый Файл(_Файл);
    ХранилищеФайла                                     = Новый ХранилищеЗначения(Файл, Новый СжатиеДанных(9));    
    НоваяЗапись.Файл                                  = ХранилищеФайла;
    НоваяЗапись.ИмяФайла                            = ПолучитьИмяФайла(_Файл);
    НоваяЗапись.РасширениеФайла                     = ПРАВ(_Файл,3);
    НоваяЗапись.ПредставлениеФайла                  = _Файл;
    //
    НаборЗаписей.Записать();
КонецПроцедуры
3 1Сергей
 
14.12.17
10:51
(2) посмотри примеры внизу:
http://howknow1c.ru/jazyk-1s/hranilishhe-znachenij-1s.html
4 falselight
 
14.12.17
10:53
Так правильно?

    ХранилищеФайла                                     = Новый ХранилищеЗначения(Новый ДвоичныеДанные(_Файл), Новый СжатиеДанных(9));    


(3) да примеров полно.
5 falselight
 
14.12.17
10:55
Как в этой процедуре отменить стандартную обработку?
А то добавляется 2 строки. Стандартной обработки нет в параметрах.
6 Lexey_
 
14.12.17
11:03
(5) "Стандартной обработки нет в параметрах" но есть другие параметры
7 alkorolev
 
14.12.17
11:06
(5) Отказ = Истина
8 falselight
 
14.12.17
11:59
(7) Да спасибо!
Сейчас такая проблема. Открываю документ. Открываю список регистра пробую добавить запись. Она добавляется всегда либо одна. То есть если добавить по нескольким документам файлы то добавится всегда одна.
Либо выходит сообщение об ошибке что значение поля не
соответствует установленному отбору.
Подскажите пожалуйста как будет правильно?
Нужно добавлять записи прикрепленных файлов по каждому
документу. Что бы все они были в регистре сведений?


//
Процедура РегистрСведенийСписокПередНачаломДобавления(Элемент, Отказ, Копирование)
    //
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    //
    Диалог.Заголовок                   = НСтр("ru = 'Выберите файл'");
    Диалог.ПолноеИмяФайла              = "";
    Диалог.МножественныйВыбор          = Ложь;
    Диалог.ПредварительныйПросмотр     = Ложь;
    Диалог.ПроверятьСуществованиеФайла = Истина;
    Диалог.Фильтр                      = "";
    Если Диалог.Выбрать() Тогда
        _Файл = Диалог.ПолноеИмяФайла;
    КонецЕсли;
    //
    НаборЗаписей                                    = РегистрыСведений.ФайлыОбъектов.СоздатьНаборЗаписей();
    //
    НаборЗаписей.Отбор.ИмяОбъекта.Установить(Элемент.Значение.Отбор.ИмяОбъекта.Значение);
    НоваяЗапись                                     = НаборЗаписей.Добавить();
    //НоваяЗапись.ИмяОбъекта                          = Элемент.Значение.Отбор.ИмяОбъекта.Значение;
    Запрос       = Новый Запрос;
    Запрос.Текст = "
        |ВЫБРАТЬ
        |    ФайлыОбъектов.НомерФайла КАК НомерФайла
        |ИЗ
        |    РегистрСведений.ФайлыОбъектов КАК ФайлыОбъектов
        |
        |УПОРЯДОЧИТЬ ПО
        |    НомерФайла УБЫВ";
    Рез = Запрос.Выполнить();
    Если Не Рез.Пустой() Тогда
        Выборка = Рез.Выбрать();
        Выборка.Следующий();
        ПоследнийНомер = Выборка.НомерФайла;
    Иначе
        ПоследнийНомер = 0;
    КонецЕсли;
    НоваяЗапись.НомерФайла                             = ПоследнийНомер + 1;
    //
    //Файл                                               = Новый Файл(_Файл);
    ХранилищеФайла                                     = Новый ХранилищеЗначения(Новый ДвоичныеДанные(_Файл), Новый СжатиеДанных(9));    
    НоваяЗапись.Файл                                  = ХранилищеФайла;
    НоваяЗапись.ИмяФайла                            = ПолучитьИмяФайла(_Файл);
    НоваяЗапись.РасширениеФайла                     = ПРАВ(_Файл,3);
    НоваяЗапись.ПредставлениеФайла                  = _Файл;
    НаборЗаписей.Записать();
    //
    Отказ = Истина;
    //
    Возврат;
КонецПроцедуры
//
9 falselight
 
14.12.17
12:03
как понять???? Я же задаю отбор и в него пишу?!!!!


{РегистрСведений.ФайлыОбъектов.Форма.ФормаСписка.Форма(49)}: Ошибка при вызове метода контекста (Записать)
    НаборЗаписей.Записать();
по причине:
Запись не верна! Значение поля не соответствует установленному отбору: ФайлыОбъектов: , 1 (Регистр сведений: Файлы объектов; Номер строки: 1; Поле: ИмяОбъекта)
10 falselight
 
14.12.17
12:06
Поправил, извиняюсь за недочет. Решаю другие проблемы с этим.

//
Процедура РегистрСведенийСписокПередНачаломДобавления(Элемент, Отказ, Копирование)
    //
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    //
    Диалог.Заголовок                   = НСтр("ru = 'Выберите файл'");
    Диалог.ПолноеИмяФайла              = "";
    Диалог.МножественныйВыбор          = Ложь;
    Диалог.ПредварительныйПросмотр     = Ложь;
    Диалог.ПроверятьСуществованиеФайла = Истина;
    Диалог.Фильтр                      = "";
    Если Диалог.Выбрать() Тогда
        _Файл = Диалог.ПолноеИмяФайла;
    КонецЕсли;
    //
    НаборЗаписей                                    = РегистрыСведений.ФайлыОбъектов.СоздатьНаборЗаписей();
    //
    НаборЗаписей.Отбор.ИмяОбъекта.Установить(Элемент.Значение.Отбор.ИмяОбъекта.Значение);
    НоваяЗапись                                     = НаборЗаписей.Добавить();
    НоваяЗапись.ИмяОбъекта                          = Элемент.Значение.Отбор.ИмяОбъекта.Значение;
    Запрос       = Новый Запрос;
    Запрос.Текст = "
        |ВЫБРАТЬ
        |    ФайлыОбъектов.НомерФайла КАК НомерФайла
        |ИЗ
        |    РегистрСведений.ФайлыОбъектов КАК ФайлыОбъектов
        |
        |УПОРЯДОЧИТЬ ПО
        |    НомерФайла УБЫВ";
    Рез = Запрос.Выполнить();
    Если Не Рез.Пустой() Тогда
        Выборка = Рез.Выбрать();
        Выборка.Следующий();
        ПоследнийНомер = Выборка.НомерФайла;
    Иначе
        ПоследнийНомер = 0;
    КонецЕсли;
    НоваяЗапись.НомерФайла                             = ПоследнийНомер + 1;
    //
    //Файл                                               = Новый Файл(_Файл);
    ХранилищеФайла                                     = Новый ХранилищеЗначения(Новый ДвоичныеДанные(_Файл), Новый СжатиеДанных(9));    
    НоваяЗапись.Файл                                  = ХранилищеФайла;
    НоваяЗапись.ИмяФайла                            = ПолучитьИмяФайла(_Файл);
    НоваяЗапись.РасширениеФайла                     = ПРАВ(_Файл,3);
    НоваяЗапись.ПредставлениеФайла                  = _Файл;
    НаборЗаписей.Записать();
    //
    Отказ = Истина;
    //
    Возврат;
КонецПроцедуры
//
11 falselight
 
14.12.17
12:11
Подскажите по несколько глупому вопросу.
Как сделать что бы в соответствии с кодом (10) можно
было бы добавлять несколько записей в регистр по одному документу. В данный момент при добавлении записи в регистр
открыв список из документа можно только перезаписывать
имеющуюся запись.
Как правильно сделать что бы добавлять несколько записей?
В другом событии записывать данные в регистр, но как
правильно это реализовать?
12 novichok79
 
14.12.17
12:41
(11) измерения, для того и измерения, чтобы знать по чему мерять. сначала определи в зависимости от чего по одному документу надо несколько записей.
потом найди реквизит который меняется от записи к записи и сделай его измерением.
13 Табуретко
 
14.12.17
12:56
(1) Вопрософилия ))

(11) сведений> (InformationRegisterRecordSet.<Имя регистра сведений>)
Записать (Write)
Синтаксис:

Записать(<Замещать>)
Параметры:

<Замещать> (необязательный)

Тип: Булево.
Определяет режим замещения существующей записи в соответствии с текущими установками отбора. Истина - перед записью существующие записи будут удалены. Ложь - записи будут дописаны к уже существующим в информационной базе записям
Значение по умолчанию: Истина
Описание:

Записывает набор записей в базу данных. В зависимости от переданного параметра, может быть выполнено добавление записей или их замещение.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Примечание:

Для регистров сведений, подчиненных регистратору, при вызове с параметром <Замещать> равным Ложь после записи в информационную базу набор записей очищается (удаляются записи из набора).
14 falselight
 
14.12.17
13:18
(12) СТРУКТУРА РЕГИСТРА ТАКОВА:

Измерения:
   ИмяОбъекта
   НомерФайла

Ресурсы:
   Файл

Реквизиты:
   ИмяФайла
   РасширениеФайла
   ПредставлениеФайла

По одному документу нужно несколько записей так как к
одному документу могут быть прикреплены несколько файлов.

Реквизиты ИмяФайла и ПоредставлениеФайла меняются.

(13) Пока не осилил.
15 Табуретко
 
14.12.17
13:27
(14) у тебя Выборка.Следующий(); не в цикле, как ты собрался несколько прикреплять?
16 falselight
 
14.12.17
13:30
(10) Это обработчик нажатия кнопки.
Выборка для наращивания номера в измерении НомерФайла.
Там не нужен цикл.

Прикреплять несколько, -
раз нажал, одну строку добавил,
второй раз нажал, добавил вторую строку (пока переписывается текущая).
И так по каждому нажатию и выбору файла новые строки.
17 Табуретко
 
14.12.17
13:31
НаборЗаписей.Записать(Ложь);
18 novichok79
 
14.12.17
13:37
(0) Что такое "Документ"? Такого в списке измерения нет. Где типы у измерений и ресурсов? Мало того что дичь спрашиваешь, так еще и неполную информацию даешь.
Для уникальности можно добавить уникальный идентификатор как измерение - тогда можно будет что угодно писать в твой регистр.
А так, задача решается проще - раз можно несколько файлов к одному объекту прикрепить и уникальность не нужна (а именно для этого делается регистр сведений), то можно просто сделать справочник "Файлы" с необходимыми полями, где элемент = 1 файл. у файла есть поле "владелец", таким образом можно напихать кучу файлов на 1 объект-владелец без мучений с регистром сведений. еще и работать быстрее будет (если индексировать справочник правильно).
19 falselight
 
15.12.17
04:32
(18 задача в регистр дожить)
20 1Сергей
 
15.12.17
06:02
после того, как установил отбор, сделай
НаборЗаписей.Прочитать();

А то ты каждый раз в пустой НаборЗаписей записываешь одну запись, остальные затираются